>我必须加载带有回调的字体,并使用反射方法将其设置为主题字体。这必须在调用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);