Активность начинается с задержкой при вызове startActivity из фонового потока и блокировании основного потока

#android #multithreading #android-activity

#Android #многопоточность #android-активность

Вопрос:

Я пытаюсь заблокировать основной поток и показать пользователю диалоговое окно (запущенное в другом 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;
}
  

И 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 с), но вызов этого метода из фонового потока немедленно запускает диалоговое окно. Почему?

Комментарии:

1. «Пожалуйста, обратите внимание, что для моего проекта требуется блокировка основного потока» — почему вы так думаете?

2. @CommonsWare Я на самом деле разрабатываю системную платформу для AOSP, которая перехватывает определенные вызовы binder. Это не обычное приложение.

3. Вы можете попробовать developer.android.com/reference/android/os/AsyncTask

4. Если вы заблокируете основной поток, Android выдаст ANR.

5. @DavidWasser Нет ANR, все работает нормально. Единственной проблемой является вышеупомянутая задержка.

Ответ №1:

Это из-за того, что служба диспетчера активности ожидает завершения работы приложения onPause . И поскольку основной поток заблокирован, ActivityManagerService ожидает 500 мс и завершает работу, а затем запускает следующее действие.