CountDownLatch блокирует обратные вызовы из других потоков - PullRequest
0 голосов
/ 09 октября 2018

Я должен загрузить шрифт с обратными вызовами и установить его в качестве шрифта темы с методом отражения.И это нужно сделать до вызова 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() не называется).Новый поток и обратные вызовы инициируются, как показано ниже:

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();

Может кто-нибудь сказать мне, что я сделал не так?Или я вообще не должен делать такие вещи (заставлять поток пользовательского интерфейса ждать)?(Для справки, шрифт обычно извлекается из кэша шрифтов Android, который занимает менее 100 мс.)

1 Ответ

0 голосов
/ 10 октября 2018

Спасибо за подсказку xingjiu, я переключил новую реализацию Thread на реализацию HandleThread, и теперь она работает безупречно:

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

, а затем запустил ее, используя тот же исполняемый файл с handler.post(runnable);

...