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
已返回到池中并且其字段已设置为 null
。 obtainMessage()
的存在支持了这个假设。
我正在向关联的处理程序发送消息 到它自己的线程。 在 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
已返回到池中并且其字段已设置为 null
。 obtainMessage()
的存在支持了这个假设。