使用`.wait()` - >`.notify()`时,处理程序的帖子不会被执行

问题描述 投票:0回答:1

我试图在下面的代码中发现我做错了什么,但我无法弄清楚,也没有在其他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:第2步

uiHandler初始化如下:

val uiHandler = new Handler(Looper.getMainLooper());

postuiHandler中唯一一种在整个代码中被调用的方法,没有任何removeCallbacksremoveMessage或类似的东西。

为什么Android没有执行Runnable块?

android multithreading wait android-handler
1个回答
0
投票

我不会说这真的是一个答案,但只要我不知道问题是什么,我就会针对我遇到的问题发布一个解决方法。

解决方法包括为wait()类交易notify()CountDownLatch

进行更改后,应用程序不再挂起(我可以说使用它增加了代码的易读性) - 赢得胜利。

© www.soinside.com 2019 - 2024. All rights reserved.