android - 从后台线程调用 startActivity 且主线程被阻塞时,Activity 启动有延迟

标签 android multithreading android-activity

我试图阻止主线程并向用户显示一个对话框 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/

相关文章:

java - 静态变量不会修改java android

在 for 循环内部或外部声明的 C++ 互斥锁

android - 在 android : activity vs fragment 中使用底部导航的最佳实践

系统终止后的 Android Activity 重新创建

Android使用facebook Conceal 库加密纯文本

php - fatal error : require_once() [function. require]:无法打开所需的 '__DIR__

java - Tomcat 7 Servlet 产生一个线程

java - 我应该为 tabhost 中的每个选项卡创建一个新的 Activity/xml 吗?

Android AsyncTask 卡住 UI

java - 使用 Cucumber、Jmeter 和 FailSafe 的自动化框架是否需要 ThreadLocal?