1

我正在向与其自己的线程相关联的处理程序发送消息。在 handleMessage 方法中,我尝试使用 runOnUiThread 使用消息内容更新 UI。如果从 handleMessage 获取消息 obj 参数并将其分配给新的最终变量,则此方法工作正常。但是,如果我不使用此分配并直接在可运行对象中获取 msg.obj,则在调用 runOnUiThread 之前检查传递给 handleMessage 的 msg 引用时,即使 msg 引用具有相同的 id,obj 变量也是 null。

为什么会这样?

这是有效的:

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());
                    }
                });
            }
4

1 回答 1

2

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

于 2018-05-13T10:40:47.423 回答