Сообщение обработчика не выполняется при использовании `.wait ()` -> `.notify ()` - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь определить, что я делаю неправильно, в приведенном ниже фрагменте кода, но я не смог ни выяснить это, ни найти ответ на другие вопросы 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?

1 Ответ

0 голосов
/ 03 апреля 2019

Я бы не сказал, что это действительно ответ, но пока я не могу понять, в чем проблема, я опубликую решение, которое у меня возникло.

Обход состоит изобмен wait() и notify() на класс CountDownLatch.

После внесения этого изменения приложение больше не зависало (и я могу сказать, что его использование увеличило читабельностькода) - победа победа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...