我有一个Handler,mHandler
,绑定到主线程。 mHandler
位于Service
。假设我现在从主线程发布Runnable
到mHandler
,如下所示:
public class SomeService extends Service {
// Handler is created on the main thread
// (and hence it is tied to the main thread)
private Handler mHandler = new Handler();
@Override
public void onDestroy() {
// onDestroy runs on the main thread
// Is the code in this Runnable processed right away?
mHandler.post(new Runnable() {
// (Some code statements that are to be run on the main thread)
...
});
super.onDestroy();
}
}
我知道这个例子有点傻,因为Handler
是不必要的。但是,这是这个问题的一个很好的例子。
现在我的问题是:
Runnable
中的代码语句是否会立即处理,因为发布Runnable
的线程也是处理Runnable
的线程?或者它的工作方式不同,因为Handler
内部使用了MessageQueue
,因此可能会Runnable
张贴到Handler
其他位置(在Runnable
之前到达post(Runnable r)
)?onDestroy()
是异步调用,因此Service
将完成,Handler
将在{{1}}之前被系统杀死{1}}可以运行代码。提前谢谢。
答案 0 :(得分:1)
由于Service
并不意味着单独的线程,因此您的runnable将发布在主Looper
队列的末尾,所以是的,可能会有消息/ runnables安排在你的之前。
同样,由于Service
并不暗示不同的主题,因此调用onDestroy
并不意味着Handler
的主题已被终止。在此示例中,您将发布到主循环器,并且该线程处于活动状态,直到应用程序进程终止。