Android 当从后台线程和被阻止的主线程调用startActivity时,活动以延迟开始
我试图阻止主线程,并向用户显示一个对话框活动(在另一个Android 当从后台线程和被阻止的主线程调用startActivity时,活动以延迟开始,android,multithreading,android-activity,Android,Multithreading,Android Activity,我试图阻止主线程,并向用户显示一个对话框活动(在另一个android:process中运行),以做出是/否的决定。用户单击“是”或“否”后,对话框活动结束,主线程继续。请注意,我的项目需要阻塞主线程 启动对话框: private boolean getUserDecision() { DialogRunnable dialogRunnable = new DialogRunnable(); Thread thread = new Thread(dialogRunnable);
android:process
中运行),以做出是/否的决定。用户单击“是”或“否”后,对话框活动结束,主线程继续。请注意,我的项目需要阻塞主线程
启动对话框:
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;
}
和对话框runnable
:
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
,对话框将在明显延迟(~1s)后启动,但从后台线程调用该方法将立即启动对话框。为什么?这是因为应用程序的onPause
要完成活动管理器服务。由于主线程被阻塞,ActivityManagerService会等待并放弃,然后启动下一个活动。“请注意,我的项目需要阻塞主线程”——你为什么这么认为?@Commonware我实际上正在为AOSP开发一个系统框架,用于钩住某些绑定器调用。这不是一个普通的应用程序。如果你阻止了主线程,你可以试试,安卓会抛出一个ANR。@DavidWasser没有ANR,一切正常。唯一的问题是上述延误。