我在线程上搜索了java API,Handler,HandlerThread,Looper以及SO,但找不到答案。当然,我也使用Eclipse的调试器来检查我的'msg'。
情况:如果通过只允许一个工作线程访问它来保护您的数据模型免于并发问题,那么您如何区分其{{1}中的Runnable与Message之间的区别如果你在同一个消息队列中将Messages和Runnables排队?
问。虽然我的Runnables在通过handleMessage(Message msg)
发布后按计划执行,但我希望检查Runnable的内容,而我的工作线程正在切换它以便我可以适当更新我的数据模型。
我欢迎所有反馈,感谢您的时间!
以下是Eclipe调试器中显示的'msg'的全部内容。这里是否有足够的信息来打开Runnable?
handler.postDelayed(myRunnable)
下面是我的工作线程的handleMessage()。具体来说,我将HandlerThread实例化为我的工作线程,并将它的getLooper()绑定到我的工作线程Handler。
msg Message (id=830030887816)
arg1 0
arg2 0
callback null
data Bundle (id=830030968104)
mAllowFds true
mClassLoader BootClassLoader (id=830023329296)
packages HashMap (id=830023329320)
parent null
mFdsKnown true
mHasFds false
mMap HashMap (id=830030980304)
mParcelledData null
flags 1
next null
obj null
replyTo null
target IncomingHandler (id=830031033176)
what 0
when 180369888
这就是我将Runnable排队的方法(我在我的工作线程上运行此代码,因此它会向自己发送一条消息,稍后将在@Override
public void handleMessage(Message msg) {
// If this is a Runnable then I need to call my method.
// This next line is a hack to test for Runnable.
// I would like to know how to inspect this Runnable
if (0 == msg.arg2 && 0 == msg.arg1 && 0 == msg.what)
incrementStateMachineBecauseRunnableStarted();
// Determine which action to take
// http://stackoverflow.com/questions/5021246/conveniently-map-between-enum-and-int-string
switch (Cmd.values()[msg.what]) {
case RECEIVE_NEW_LIST_EMPLOYEES:
receiveNewListEmployees(msg);
break;
case UPDATE_ONE_EMPLOYEE_STATE:
updateOneEmployeeState(msg);
break;
default:
Log.e(this.getClass().getName(), "unexpected message.";
break;
}
中处理):
handleMessage(Message msg)
...这就是我将我的消息排入队列的方式(来自另一个线程):
// Create a new Runnable for this employee
PostUpdate update = new PostUpdate(employee);
// Post this Runnable with a sort delay
postDelayed(update, WAIT_BEFORE_PUSH_MS);
最后,我的Runnable:
Message msg = mHandler.obtainMessage();
msg.what = Cmd.RECEIVE_NEW_LIST_EMPLOYEES.ordinal();
msg.arg1 = 77; // deliberately inserting debug value
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(Cmd.RECEIVE_NEW_LIST_EMPLOYEES.toString(), mEmployees);
msg.setData(bundle);
mHandler.sendMessage(msg);
答案 0 :(得分:1)
使用调试器和检查元素的结论是,您无法在handleMessage()中确定是否正在处理消息或runnable。
我在经验上(通过消除)发现我的所有Runnables都有一个msg.what == 0当我将所有消息设置为msg.what不是0时使用。小心使用!