getLooper() возвращает ноль после запуска HandlerThread

У меня класс расширяется HandlerThreadэто выглядит так:

public class MyHandlerThread extends HandlerThread {

  private Object lock;

  //constructor
  public MyHandlerThread() {
     super(“MyHandlerThread”);
     lock = new Object();
  }

  public void prepare() {
     //starts the handler thread
     start();

     //Wait for thread starting
     Log.d(TAG, "wait for thread starting…");
     synchronized (lock) {
        try {
            lock.wait(5000);
        } catch (InterruptedException e) {
            Log.e(TAG, "Failed to wait for thread to start");
        }
     }

     //WHY getLooper() returns null here?
     if(getLooper() == null) {
         Log.d("GET LOOPER NULL!");
     }
  }

  @Override
  public void run() {
    Log.d("run() begin...");
    initializeSomeObjects()
    Log.d(“initialise objects done!”);

    //Notify that run() finished
    synchronized (lock) {
       lock.notify();
    }
    Log.d("run() end!”);
  }

}

Как вы видите выше, prepare() функция запускает поток и ждет run() чтобы закончить, а затем попытаться получить петух.

В другом классе я создаю экземпляр MyHandlerThread & Начни это:

MyHandlerThread myThread = new MyHandlerThread();
myThread.prepare();

Журналы, отображаемые в консоли:

wait for thread starting…
run() begin...
initialise objects done!
run() end!
GET LOOPER NULL!

Почему в prepare() функция, вызов getLooper() возвращает ноль, хотя поток уже запущен (run() выполняется)?

1 ответ

Решение

HandlerThreadLooper инициализируется в HandlerThread#run(),

Если вы переопределите метод и не вызываете super.run()код инициализации из суперкласса не выполняется.

Другие вопросы по тегам