我试图阻止主线程并向用户显示一个对话框 Activity (在另一个 android:process
中运行)以做出是/否决定。用户单击"is"或“否”后,对话框 Activity 结束,主线程恢复。请注意,我的项目需要阻塞主线程。
启动对话框:
private boolean getUserDecision() {
DialogRunnable dialogRunnable = new DialogRunnable();
Thread thread = new Thread(dialogRunnable);
thread.start();
while (thread.isAlive()) {
try {
// block the thread until user enters his decision
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return dialogRunnable.decision;
}
和DialogRunnable
:
class DialogRunnable extends Runnable {
public boolean decision;
@Override
public void run() {
Looper.prepare();
Intent intent = /* intent for launching the dialog */
intent.setResultMessenger(new Messenger(new Handler() {
@Override
public void handleMessage(Message msg) {
Looper.myLooper().quit();
decision = msg.arg1 == 1;
}
}));
startActivity(intent);
Looper.loop();
}
}
意外行为
如果在主线程上调用 getUserDecision
,则对话框会在明显的延迟(约 1 秒)后启动,但从后台线程调用该方法会立即启动对话框。为什么?
最佳答案
这是因为 Activity 管理器服务 waiting以便应用的 onPause
完成。并且由于主线程被阻塞,ActivityManagerService 等待 500ms并放弃,然后开始下一个 Activity 。
关于android - 从后台线程调用 startActivity 且主线程被阻塞时,Activity 启动有延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55495530/