CountDownLatch 阻止来自其他线程的回调



>我必须加载带有回调的字体,并使用反射方法将其设置为主题字体。这必须在调用onCreate()中的setContentView()之前完成。 我尝试在主线程上使用如下所示的CountDownLatch,以使其等待字体加载过程:

loadFont();
try {
System.out.println("latch awaiting");
latch.await();
} catch (InterruptedException e) {
System.out.println("latch error");
e.printStackTrace();
} finally {
System.out.println("latch error");
latch.countDown();
}

但似乎回调已启动,但从未像往常那样返回任何结果(onTypefaceRetrieved()未调用(。新线程和回调的启动方式如下:

Runnable runnable = new Runnable(){
@Override
public void run() {
FontCall.Callback callback = new FontCall.FontCallback(){
@Override
public void onFontRetrieved(final Typeface typeface) {
//do reflection stuff
latch.countDown();
} 
@Override
public void onError(int err) {
//handle error
latch.countDown();
}
};
FontCall.requestFont(callback);
}
};
Thread thread = new Thread(runnable);
thread.run();

谁能告诉我我做错了什么?还是我根本不应该做这种事情(让 UI 线程等待(?(作为参考,字体通常从 Android 的字体缓存中检索,大约需要不到 100 毫秒的时间。

感谢兴久的提示,我将新的 Thread 实现切换到 HandleThread 实现,现在它完美运行:

HandlerThread handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
Looper looper = handlerThread.getLooper();
Handler handler = new Handler(looper);

然后使用相同的可运行对象运行它handler.post(runnable);

最新更新