Я пытаюсь определить, что я делаю неправильно, в приведенном ниже фрагменте кода, но я не смог ни выяснить это, ни найти ответ на другие вопросы StackOverflow.
При выполнении приведенного ниже кода код внутри блока runnable иногда не выполняется, что приводит к зависанию моего приложения до тех пор, пока пользователю не будет выдано ANR.
private void initializeOnMainThread(final Context appContext) {
final Object syncLock = new Object();
Runnable runnable = new Runnable() {
@Override
public void run() {
// some init stuff
Log.d("CUSTOM_TAG", "STEP 3");
synchronized (syncLock) {
Log.d("CUSTOM_TAG", "STEP 4");
syncLock.notify();
Log.d("CUSTOM_TAG", "STEP 5");
}
}
};
if (Looper.myLooper() == Looper.getMainLooper()) {
runnable.run();
} else {
uiHandler.post(runnable);
Log.d("CUSTOM_TAG", "STEP 1");
try {
synchronized (syncLock) {
Log.d("CUSTOM_TAG", "STEP 2");
syncLock.wait();
Log.d("CUSTOM_TAG", "STEP 6");
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
Печатный журнал выглядит следующим образом:
D / CUSTOM_TAG: ШАГ 1
D / CUSTOM_TAG: STEP 2
Инициализация uiHandler
выглядит следующим образом:
val uiHandler = new Handler(Looper.getMainLooper());
И post
- это единственный метод из uiHandler
, который вызывается во всем коде, не вызывается removeCallbacks
, removeMessage
или что-либо подобное.
Почему Android не выполняет блок Runnable?