2

クラス extends が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()、呼び出しがnullgetLooper()を返すのはなぜですか?run()

4

1 に答える 1

4

HandlerThread Looperで初期化されHandlerThread#run()ます。

メソッドをオーバーライドして を呼び出さない場合super.run()、スーパークラスからの初期化コードは実行されません。

于 2015-10-08T18:43:08.013 に答える