代码之家  ›  专栏  ›  技术社区  ›  Blundell

Android处理程序消息和列表视图

  •  9
  • Blundell  · 技术社区  · 14 年前

    这是我的错误:

    *** 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)
    

    单击我的某个元素会激发启动新活动的意图。 单击另一个显示祝酒词。 当这些被组合在一起时,我得到上面的错误。也就是说,单击文本来激发意图,(然后按back),然后单击图像来显示toast,然后当您单击文本来再次激发意图时,我得到FC。

    如果您想跳过重要的内容,请查看ConversationAdapter.class中的onClickListener,以及它们如何与StartPage.class交互

    Android清单:

    <?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>
    

    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类

    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");      
    }
    
    
    }
    

    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;
    }
    }
    

    会话适配器类:

    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;
    }
    }
    

    <?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>
    

    收件箱\u 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>
    
    1 回复  |  直到 6 年前
        1
  •  32
  •   Peter Knego    14 年前

    我猜你是在发送两次同样的信息。实际上在密码里有一个 new Message() 还有两个 mHandler.sendMessage(m)

    每次发送邮件时,请尝试生成新邮件。

    编辑:

    Message.obtain() Message m = new Message() (因为它在引擎盖下回收用过的信息)

    在你的情况下你可以使用 new.copyFrom(old) 如果需要现有消息的副本。