Android的处理器信息和ListView [英] Android Handler Message and ListView

查看:113
本文介绍了Android的处理器信息和ListView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我现在道歉,很长的帖子,但这是我能解释的唯一途径,而谷歌给出了不是决定性的3结果页

I apologise now for the LONG post but this is the only way I could explain, and google gives 3 pages of results that aren't conclusive

这是我的错误的家伙:

*** Uncaught remote exception!  (Exceptions are not yet supported across processes.)
android.util.AndroidRuntimeException: { what=1008 when=368280372 } This message is already in use.
at android.os.MessageQueue.enqueueMessage(MessageQueue.java:171)
at android.os.Handler.sendMessageAtTime(Handler.java:457)
at android.os.Handler.sendMessageDelayed(Handler.java:430)
at android.os.Handler.sendMessage(Handler.java:367)
at android.view.ViewRoot.dispatchAppVisibility(ViewRoot.java:2748)

我正在尝试是有一个列表视图,即通过填充自定义列表项,每个项目都有多个视图,每个视图都有附加一个onclick听众。当此onClickListener是pressed它发送一个消息到一个处理一个什么,ARG1参数。 点击我的元素之一触发的意图,开始一个新的活动。 单击其他显示敬酒。 当这些都pssed在组合$ P $我得到上述错误。即单击文本火的意图,(那么preSS回),然后单击图像,显示敬酒,那么当您单击文本再次触发的意图我得到的FC。

What I'm attempting is to have a listview, that is populated by custom list items, each list item has multiple views and each view has an onclick listener attached. When this onClickListener is pressed it sends a Message to a Handler with a what and arg1 arguments. Clicking one of my elements fires an intent to start a new activity. Clicking the other shows a toast. When these are pressed in a combination I get the error above. Namely clicking the text to fire the intent, ( then press back) then clicking the image to show the toast, then when you click the text to fire the intent again I get the FC.

我创建了一个示范项目,转载如下: <一href="http://rapidshare.com/files/429227042/HandlerTest.rar">http://rapidshare.com/files/429227042/HandlerTest.rar

I have created a demo project that reproduces this: http://rapidshare.com/files/429227042/HandlerTest.rar

这里是code以下,我试图删除尽可能多的克鲁夫特,我可以去错误的骨头:

And here is the code below, I tried to remove as much cruft as I could to get to the bones of the error:

如果你想跳到什么重要看onClickListener在ConversationAdapter.class以及它们如何与StartPage.class互动

If you want to skip to whats important look at the onClickListener's in ConversationAdapter.class and how they interact with StartPage.class

Android清单:

Android Manifest:

<?xml version="1.0" encoding="utf-8"?>
  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.handler.test"
    android:versionCode="1"
    android:versionName="1.0">
      <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".StartPage"
              android:label="@string/app_name">
            <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    <activity
        android:name=".DetailsPage"
        android:label="DetailsPage"
        >
    </activity> 
    </application>
    <uses-sdk android:minSdkVersion="3" />
</manifest>

StartPage.class:

StartPage.class:

package com.handler.test;

import java.util.ArrayList;

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;

public class StartPage extends ListActivity {

private ArrayList<Conversation> mConversations = null;
private ConversationAdapter mAdapter;
private Context mContext;
private ProgressDialog mProgressDialog;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mContext = this;

    mConversations = new ArrayList<Conversation>();
    this.mAdapter = new ConversationAdapter(mContext, R.layout.inbox_row, mConversations, mHandler);
    setListAdapter(this.mAdapter);

    new Thread(new Runnable() {
        @Override
        public void run() {
            getConversations();
        }
    }).start();

    mProgressDialog = ProgressDialog.show(StartPage.this, "Please wait...", "Retrieving data ...", true);
}

private void getConversations() {
    try {
        mConversations = new ArrayList<Conversation>();
        Conversation o1 = new Conversation();
        o1.setStatus("SF services");
        o1.setMessage("Pending");           
        mConversations.add(o1);
    } catch (Exception e) {
        Log.e("BACKGROUND_PROC", e.getMessage());
    }
    runOnUiThread(returnRes);
}

private Runnable returnRes = new Runnable() {
    @Override
    public void run() {
        if(mConversations != null && mConversations.size() > 0){
            mAdapter.notifyDataSetChanged();
            for(int i=0;i<mConversations.size();i++)
                mAdapter.add(mConversations.get(i));
        }
        mProgressDialog.dismiss();
        mAdapter.notifyDataSetChanged();
    }
  };

private Handler mHandler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        int convIndex = msg.arg1;
        int viewTouched = msg.what;
        switch(viewTouched){
            case ConversationAdapter.PROF_ICON:
                showNumber(convIndex);
            break;
            case ConversationAdapter.MESSAGE:
                showMessageDetails(convIndex);
            break;
        }
        super.handleMessage(msg);
    }
};

private void showNumber(int convIndex) {
    Toast.makeText(mContext, "Pressed: "+convIndex, Toast.LENGTH_LONG).show();
}

private void showMessageDetails(int convIndex) {
    final Conversation conv = mConversations.get(convIndex);
    Intent i = new Intent(mContext, DetailsPage.class);
    i.putExtra("someExtra", conv);
    startActivity(i);
}
}

DetailsPage.class

DetailsPage.class

package com.handler.test;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class DetailsPage extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Log.i("Test", "Details Page");      
}


}

Conversation.class:

Conversation.class:

package com.handler.test;

import java.io.Serializable;

public class Conversation implements Serializable {

private static final long serialVersionUID = -437261671361122258L;

private String status;

public String getStatus() {
    return status;
}
public void setStatus(String status) {
    this.status = status;
}
}

ConversationAdapter.class:

ConversationAdapter.class:

package com.handler.test;

import java.util.ArrayList;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class ConversationAdapter extends ArrayAdapter<Conversation> {

public static final int PROF_ICON = 0;
public static final int MESSAGE = 1;

private Context mContext;
private Handler mHandler;
private ArrayList<Conversation> mItems;
private int mXmlId;

private LinearLayout detailsOfConv;
private ImageView iconImage;

public ConversationAdapter(Context context, int textViewResourceId, ArrayList<Conversation> items, Handler handler) {
    super(context, textViewResourceId, items);
    this.mContext = context;
    this.mItems = items;
    this.mXmlId = textViewResourceId;
    this.mHandler = handler;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(mXmlId, null);
    }
    final Message m = new Message();
    m.arg1 = position;
    Conversation c = mItems.get(position);
    if (c != null) {
        iconImage = (ImageView) v.findViewById(R.id.icon);
        if (iconImage != null) {
            iconImage.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    m.what = PROF_ICON;
                    mHandler.sendMessage(m);
                }
            });
        }

        detailsOfConv = (LinearLayout) v.findViewById(R.id.details);
        if(detailsOfConv != null){
            detailsOfConv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    m.what = MESSAGE;
                    mHandler.sendMessage(m);
                }
            });
        }
    }
    return v;
}
}

main.xml中:

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dip"
>
<ListView
 android:id="@+id/android:list"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:cacheColorHint="#00000000"
 />
</LinearLayout>

inbox_row.xml:

inbox_row.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="?android:attr/listPreferredItemHeight"
  android:padding="6dip">
  <ImageView
    android:id="@+id/icon"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_marginRight="6dip"
    android:src="@drawable/icon" />
  <LinearLayout
    android:id="@+id/details"
    android:orientation="vertical"
    android:layout_width="0dip"
    android:layout_weight="1"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/toptext"
        android:textColor="#99FF66"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:singleLine="true"
        android:text="123456789"
        />       
  </LinearLayout>
</LinearLayout>

对不起,所有的code!

Sorry for all the code!

推荐答案

我的猜测是,你发送两次相同的消息。事实上,在code有一个新信息()和两个 mHandler.sendMessage(M)这是可能两者都执行。

My guess would be that you are sending twice the same message. Indeed in the code there is one new Message() and two mHandler.sendMessage(m) which are possibly both executed.

试着做一个新的消息您发送一条消息每一次。

Try making a new message for every time you send a message.

编辑:

<一个href="http://developer.android.com/reference/android/os/Message.html#obtain%28%29">Message.obtain()是preferable到消息m =新信息()(因为它回收罩下使用的消息)

Message.obtain() is preferable to Message m = new Message() (because it recycles used messages under the hood)

在你的情况,你可以使用<一个href="http://developer.android.com/reference/android/os/Message.html#copyFrom%28android.os.Message%29">new.copyFrom(old)如果你需要现有的邮件的副本。

In your case you could use new.copyFrom(old) if you need a copy of existing message.

这篇关于Android的处理器信息和ListView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆