我试图在下面的代码中发现我做错了什么,但我无法弄清楚,也没有在其他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());
post
是uiHandler
中唯一一种在整个代码中被调用的方法,没有任何removeCallbacks
,removeMessage
或类似的东西。
为什么Android没有执行Runnable块?
我不会说这真的是一个答案,但只要我不知道问题是什么,我就会针对我遇到的问题发布一个解决方法。
解决方法包括为wait()
类交易notify()
和CountDownLatch
。
进行更改后,应用程序不再挂起(我可以说使用它增加了代码的易读性) - 赢得胜利。