按顺序执行处理程序的事项
Matter of Handlers execution in a sequence
我从一个解释处理程序的网站上截取了 Android(一个线程的东西)。
@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
将首先执行这两个任务中的哪一个。我需要一个解释,提前谢谢你。
My question is that whether it's true that the second handler will be
executed last just after the first handler finishes its job.
一个 Handler
实例关联到单个 Thread
(也称为 消息队列 )。
Runnable
在此 Thread
上按顺序执行。
调用 post()
会将 Runnable
放在该队列的末尾,所以是的,第二个 Runnable
将在第一个之后执行。
没有两个处理程序在运行,UI 线程 (mUiHandler
) 上只有一个处理程序。您的辅助线程正在创建 Runnable
对象并将它们发布到 Handler
。它们将由处理程序按照它们发布的顺序执行。由于线程的循环首先执行并发布,然后线程通过发布 "second" Runnable
完成,相对于循环中发布的其他内容,第二个将始终最后执行。
最外层的匿名 Runnable
,即传递给 new Thread(...)
构造函数的那个,是后台线程中的 运行s。 运行nable 中的所有内容都将按顺序执行 - 一条指令接一条指令。
因为 运行nable 有一个 for
循环,只有在那之后最后的 toast 出现,你保证它会 运行 在循环体之后。
我从一个解释处理程序的网站上截取了 Android(一个线程的东西)。
@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
将首先执行这两个任务中的哪一个。我需要一个解释,提前谢谢你。
My question is that whether it's true that the second handler will be executed last just after the first handler finishes its job.
一个 Handler
实例关联到单个 Thread
(也称为 消息队列 )。
Runnable
在此 Thread
上按顺序执行。
调用 post()
会将 Runnable
放在该队列的末尾,所以是的,第二个 Runnable
将在第一个之后执行。
没有两个处理程序在运行,UI 线程 (mUiHandler
) 上只有一个处理程序。您的辅助线程正在创建 Runnable
对象并将它们发布到 Handler
。它们将由处理程序按照它们发布的顺序执行。由于线程的循环首先执行并发布,然后线程通过发布 "second" Runnable
完成,相对于循环中发布的其他内容,第二个将始终最后执行。
最外层的匿名 Runnable
,即传递给 new Thread(...)
构造函数的那个,是后台线程中的 运行s。 运行nable 中的所有内容都将按顺序执行 - 一条指令接一条指令。
因为 运行nable 有一个 for
循环,只有在那之后最后的 toast 出现,你保证它会 运行 在循环体之后。