RunOnUiThread 无法直接访问 Message

RunOnUiThread can't access Message directly

我正在向关联的处理程序发送消息 到它自己的线程。 在 handleMessage 方法中,我尝试用以下内容更新 UI 使用 runOnUiThread 的消息。 如果从 handleMessage 中获取 message obj 参数,这就可以正常工作 并将其分配给一个新的最终变量。 但是如果我不使用这个赋值,直接在runnable中取msg.obj obj 变量为 null,即使 msg 引用具有相同的 id 在调用 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());
                    }
                });
            }

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