Android:如何在Message Queue中启用Runnable?

时间:2013-06-06 00:55:48

标签: android handler message-queue runnable

我在线程上搜索了java API,HandlerHandlerThread,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);

1 个答案:

答案 0 :(得分:1)

使用调试器和检查元素的结论是,您无法在handleMessage()中确定是否正在处理消息或runnable。

我在经验上(通过消除)发现我的所有Runnables都有一个msg.what == 0当我将所有消息设置为msg.what不是0时使用。小心使用!