我从一个解释Android处理程序的网站(一个线程化的东西)中获取了这个snipet。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread myThread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 4; i++) {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (i == 2) {
mUiHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MyActivity.this, "I am at the middle of background task",
Toast.LENGTH_LONG)
.show();
}
});
}
}//ends for()
// THE SECOND HANDLER, RIGHT HERE!
mUiHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MyActivity.this,
"Background task is completed",
Toast.LENGTH_LONG)
.show();
}
});
} //ends run()
});
myThread.start();
从第二次执行Handler
中输出的任务判断,这是
Toast.makeText(MyActivity.this,
"Background task is completed",
Toast.LENGTH_LONG)
.show();
似乎文章的作者非常确定第二个Handler
将在最后执行。
我的问题是,在第一个Handler
完成其工作之后,第二个Handler
是否会被执行。虽然,当我多次运行它时,是的,它最后执行了。在我看来,由于Handler
是在后台Thread
完成的,那么我们不应该知道(甚至预测)Handler
首先执行的那两个任务中的哪一个。我需要一个解释,谢谢你。
答案 0 :(得分:2)
我的问题是第二个处理程序是否属实 在第一个处理程序完成其工作后最后执行。
Handler
个实例与单个Thread
(也称为消息队列)相关联。
Runnable
按顺序执行此Thread
。
调用post()
会将Runnable
放在该队列的末尾,是的,第二个Runnable
将在第一个之后执行。
答案 1 :(得分:1)
在游戏中没有两个处理程序,只是UI线程上的一个处理程序(mUiHandler
)。您的辅助线程正在创建Runnable
个对象并将其发布到Handler
。它们将由处理程序按发布顺序执行。由于线程的循环首先执行并发布,然后线程通过发布“second”Runnable
完成,第二个将始终执行last,相对于循环中发布的其他内容。
答案 2 :(得分:1)
传递给Runnable
构造函数的最外层匿名new Thread(...)
是在后台线程中运行的。 runnable中的所有内容都将按顺序执行 - 一条指令接着另一条指令。
因为runnable有一个for
循环,只有在那之后才出现最终的toast,你保证它会在循环体之后运行。