#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, все работает нормально. Единственной проблемой является вышеупомянутая задержка.