2

新しいスレッドを作成するコードがいくつかあり、そのスレッド内にハンドラーとルーパーがあります。呼び出しスレッドは、このハンドラーに投稿できます。

class MyClass {

    Handler mHandler = null;
    Thread mThread = null;

    MyClass() {
        mThread = new Thread() {
            public void run() {
                Looper.prepare();
                mHandler = new Handler();
                Looper.loop();
            }
        };

        mThread.start();

        /* ... */

        mHandler.post(...);
    }
}

このコードは、ドキュメントの例からほぼ直接外れています。しかし、それがどのように正しいのか理解できません。mHandler は子スレッド内で初期化されるため、いつ発生するかは保証できません。このコードが最後の行で null ハンドラーに送信されないようにするものは何ですか?

このコードが正しくない場合、新しく作成されたスレッドでハンドラーを同期的に作成する方法は何ですか?

4

3 に答える 3

1

最も簡単な方法は、HandlerThread を使用することです。

class MyClass {

    final Handler mHandler = null;
    final HandlerThread mThread = null;

    MyClass() {
        mThread = new HandlerThread("...");
        mThread.start();
        mHandler = new Handler(mThread.getLooper());

        /* ... */

        mHandler.post(...);
    }
}

ルーパーは Thread.start() 内で作成されるため、これにより同期の問題が回避されます。したがって、親スレッド内でハンドラーをそのルーパーにリンクできます。

于 2012-08-27T06:29:13.100 に答える
0

あなたの例では、ルーパーとは何ですか(どこで宣言されていますか)? スレッドは、プロセス内で作成され、そのデータを共有する軽量プロセスです。スレッドは、新しいスレッド (子スレッド) を作成し、それが別のスレッドを作成することもできます。ミューテックス、ロック、およびセマフォを確認することをお勧めします。

フラグ(スレッドのグループに表示される)を使用して、それらの動作を決定できます。

于 2012-08-12T22:56:11.367 に答える
0

私はこの方法を使用して仕事をします。これは最善の方法ではないと思いました。もっと良いアイデアを知りたいだけなので、これを捨てます。

mThread = new Thread() {

    public void run() {
        Looper.prepare();
        mLooper = Looper.myLooper();
        mHandler = new Handler();
        Looper.loop();
        }
    };

mThread.start();

......
timeout = 0;
mHandler2 = new Handler ();
DetectHandlerIsReady detect = new DetectHandlerIsReady ();
detect.run ();

class DetectHandlerIsReady implements Runnable {
    public void run ()
    {
         if (mHandler != null) { 
              mHandler.post (....);
         } else if (timeout <= 30) {
              timeout++;
              mHandler2.postDelay (detect, 1000);
              return;
         } 

         // timeout, and mHandler is not ready yet
    }
}
于 2012-08-12T22:50:45.997 に答える