活动处理程序和视图处理程序android的区别

时间:2015-08-07 16:16:26

标签: android android-handler

我试图从ListView的OnItemClickListener的onItemClick()方法向活动处理程序发送消息。

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Handler handler = view.getHandler();
    String data = "MSG DATA";
    Message msg = handler.obtainMessage(MSG_TYPE, data);
    msg.sendToTarget();
}

我在活动中有一个处理程序

Handler mHandler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
    int msgId = msg.what;
    Log.d(TAG,"GOT msg : " + msgId);
    }
}

但我没有收到消息和应用程序崩溃。

java.lang.ClassCastException: java.lang.String cannot be cast to android.view.View$AttachInfo$InvalidateInfo
       at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:3175)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:135)
       at android.app.ActivityThread.main(ActivityThread.java:5289)
       at java.lang.reflect.Method.invoke(Native Method)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

来自getHandler()的文档:

  

与运行View的线程关联的处理程序。此处理程序可用于在UI事件队列中抽取事件。

因此,如果视图是在activity中创建的,那么它们都应该在同一个线程上。为什么我会崩溃?这两个不同的处理程序是什么?

1 个答案:

答案 0 :(得分:3)

  

这两种不同的处理程序是什么?

它们是不同的Handler附加到同一个UI线程Looper

  

因此,如果视图是在activity中创建的,那么它们都应该在同一个线程上。为什么我会崩溃?

当您执行handler.obtainMessage(MSG_TYPE, data);时,它实际上将target设置为handler。因此,当您致电msg.sendToTarget();时,它会将消息发送至View的{​​{1}},而不是Handler的消息。您收到此异常是因为Activity的{​​{1}}不知道如何处理View

Handler的{​​{1}}设为String,您就不会崩溃。