如下代码。我的预期是在调用Looper.myLooper().quitSafely()后,仍然能处理消息3,然后退出循环,走到loop end那里。
但是,quitSafely实际结果并没有退出循环,而是一直卡住,并不会走到next。是什么原因呢? 谢谢。
ThreadUtils.getCpuPool().execute(() ->
{
Looper.prepare();
Log.i("loop", "prepare time: " + System.currentTimeMillis());
Handler handler = new Handler(Looper.myLooper(), msg ->
{
System.out.println(msg.what);
return true;
});
// message 1
handler.sendEmptyMessage(1);
// message 2
handler.post(() ->
{
try
{
Log.i("loop", "first run.");
Thread.sleep(1000);
// Looper.myLooper().quit(); // 立即退出loop循环, 符合预期
Looper.myLooper().quitSafely(); // 没有退出循环,似乎阻塞了,无法理解
} catch (InterruptedException e)
{
e.printStackTrace();
}
});
// message 3
handler.sendEmptyMessage(3);
Looper.loop();
// loop end.
Log.i("loop", "end time: " + System.currentTimeMillis());
});
Thread.sleep(10000); // Junit测试,主线程sleep以让上面的子线程能完成任务