我试图从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中创建的,那么它们都应该在同一个线程上。为什么我会崩溃?这两个不同的处理程序是什么?
答案 0 :(得分:3)
这两种不同的处理程序是什么?
它们是不同的Handler
附加到同一个UI线程Looper
。
因此,如果视图是在activity中创建的,那么它们都应该在同一个线程上。为什么我会崩溃?
当您执行handler.obtainMessage(MSG_TYPE, data);
时,它实际上将target
设置为handler
。因此,当您致电msg.sendToTarget();
时,它会将消息发送至View
的{{1}},而不是Handler
的消息。您收到此异常是因为Activity
的{{1}}不知道如何处理View
。
将Handler
的{{1}}设为String
,您就不会崩溃。