我必须加载带有回调的字体,并使用反射方法将其设置为主题字体。这必须在调用setContentView()
中的onCreate()
之前完成。
我尝试如下在主线程上使用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()
)。新线程和callbacksks如下启动:
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毫秒的时间。)
答案 0 :(得分:0)
感谢xingjiu的提示,我将新的Thread实现切换为HandleThread实现,现在可以正常使用了:
HandlerThread handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
Looper looper = handlerThread.getLooper();
Handler handler = new Handler(looper);
,然后使用与handler.post(runnable);
相同的runnable来运行它