RunOnUiThread无法直接访问Message

时间:2018-05-13 10:06:19

标签: java android java-threads android-thread

我正在向与之关联的处理程序发送消息 它自己的线程。 在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());
                    }
                });
            }

1 个答案:

答案 0 :(得分:2)

我的猜测是操作系统正在重用这些Message个对象,而不是创建新的对象。当您的Runnable开始在UI线程上运行时,Message已返回到池中,其字段已设置为nullobtainMessage()的存在支持了这一假设。