Я пытаюсь заблокировать основной поток и показать пользователю диалоговую активность (запущенную в другом 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 с), но вызов этого метода из фонового потока немедленно запускает диалоговое окно. Почему?