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

时间:2018-10-09 08:43:13

标签: android multithreading callback countdownlatch

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

1 个答案:

答案 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来运行它