我正在向与之关联的处理程序发送消息 它自己的线程。 在handleMessage方法中,我尝试使用内容更新UI 使用runOnUiThread的消息。 如果从handleMessage获取消息obj参数,这可以正常工作 并将其分配给新的最终变量。 但是如果我不使用这个赋值并直接在runnable中使用msg.obj 即使msg引用具有相同的id,obj变量也为null 在调用runOnUiThread之前检查传递给handleMessage的msg引用时。
为什么会这样?
这是有效的:
bt01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Message msg = new Message();
msg.obj = new Data("Hi im the message");
mHandler.sendMessage(msg);
}
});
class LooperThread extends Thread {
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(final Message msg) {
final Object messageString = msg.obj;
runOnUiThread(new Runnable() {
@Override
public void run() {
tv01.setText(((Data)messageString).getMessage());
}
});
}
};
Looper.loop();
}
}
这不起作用:
public void handleMessage(final Message msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
tv01.setText(((Data)msg.obj).getMessage());
}
});
}
答案 0 :(得分:2)
我的猜测是操作系统正在重用这些Message
个对象,而不是创建新的对象。当您的Runnable
开始在UI线程上运行时,Message
已返回到池中,其字段已设置为null
。 obtainMessage()
的存在支持了这一假设。