Дело выполнения обработчиков в последовательности
Я взял этот фрагмент с сайта, объясняющего обработчик в 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
выполнит первым. Мне нужно объяснение, спасибо заранее.
3 ответа
Самый анонимный Runnable
тот передал new Thread(...)
конструктор, это то, что работает в фоновом потоке. Все внутри этого работающего будет выполняться последовательно - одна инструкция за другой.
Так как этот управляемый имеет for
цикл, и только после этого появляется последний тост, вы гарантированно запустите его после тела цикла.
Мой вопрос заключается в том, правда ли, что второй обработчик будет выполняться последним сразу после того, как первый обработчик завершит свою работу.
Handler
Экземпляр связан с одним Thread
(также называется очередью сообщений).
Runnable
S выполнены на этом Thread
последовательно.
призвание post()
поставит Runnable
в конце этой очереди, так что да, второй Runnable
будет выполнен после первого.
В игре нет двух обработчиков, только один обработчик в потоке пользовательского интерфейса (mUiHandler
). Ваш вторичный поток создает Runnable
объекты и размещение их на Handler
, Они будут выполнены обработчиком в порядке их размещения. Так как цикл потока выполняется и публикуется первым, то поток завершается отправкой "второго" Runnable
, этот второй всегда будет выполняться последним, относительно других вещей, размещенных в цикле.