Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当从后台线程和被阻止的主线程调用startActivity时,活动以延迟开始_Android_Multithreading_Android Activity - Fatal编程技术网

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,一切正常。唯一的问题是上述延误。