2016-07-07 6 views
1

ルーパについて理解する必要があります。 Looperは適切なハンドラを参照して、スレッドのMessageQueueに関連付けられたMessageオブジェクトとRunnableオブジェクトを送信して処理します。ハンドラを呼び出すときにLooper.prepare()を呼び出す必要があります

デフォルトでは、スレッドにはメッセージループがありませんに関連付けられているため、ルーパーもありません。スレッド用のルーパーを作成し、そのスレッドをメッセージループからシリアルに処理するために、Looperクラスを使用することができます。

次は私のコードで私はルーパーを起動していない明示的に

Thread background2 = new Thread(new Runnable() { 

      @Override 
      public void run() { 

      for (int i = 0; i < 5; i++) { 
       final int v =i; 
        try { Thread.sleep(1000); 
        handler.post(new Runnable() { 
        @Override 
        public void run() { 
         txt.setText(txt.getText() + "Thread 2 current i : " + String.valueOf(v) +System.getProperty("line.separator")); 
        } 
        }); 
        } catch (Exception e) { 
         Log.v("Error", e.toString()); 
        } 
       } 

      } 
     }); 

それが実行可能なタスクが/キューに置かれていないことを意味していますか?それらの両方が同じハンドラにアクセスして、この

Thread background3 = new Thread(new Runnable() { 

      @Override 
      public void run() { 
    Looper.prepare(); 
      for (int i = 0; i < 5; i++) { 
       final int v =i; 
        try { Thread.sleep(1000); 
        handler.post(new Runnable() { 
        @Override 
        public void run() { 
         txt.setText(txt.getText()+ "Thread 3 set : " + String.valueOf(v) +System.getProperty("line.separator")); 
        } 
        }); 
        } catch (Exception e) { 
         Log.v("Error", e.toString()); 
        } 
       } 
Looper.loop(); 
      } 
     }); 

と上記のコードの違いは何ですか。彼らはどちらもうまく動作します。

+0

'Thread'は、あなたが求めているものなら、' Thread'の 'Handler'に' Looper'を投稿する必要はありません。あなたの例の 'Handler'は他の' Thread'sのものです。どちらの 'Thread'sを作成していてもかまいません。 –

+0

こんにちは、私は今混乱していますので、私の2番目の例の違いは、明示的にLooper.prepare()を呼び出していますが、それがなくてもまだ動作します –

+0

'Thread'の' Looper'を作成することは_other_ 'スレッド'はそれに投稿できます。あなたの例の 'Looper'は本当に何もしていません。あなたがそこに作成された' Handler'に何かを投稿していないからです。違いが見られません。 –

答えて

1

ThreadLooperを作成すると、他のThreadからのメッセージを受信するようにThreadを設定することを意味します。 2番目の例では、Threadに何も送信していないため、両方の例はまったく同じように動作しています。つまり、background3Looperは実際には使用されていません。両方の例で

、あなたはメイン ThreadLooperのために作成された Handlerから Runnableを投稿しています。 Handlerは、たとえば background2のようには作成していません。その Handlerはメイン Threadとその Looperに属し、投稿するものはメインキューに入れられ、メイン Threadで実行されます。

あなたの例の唯一の違いは、第二ThreadLooperを持っており、あなたがしたい場合、あなたはそれにポストは、可能性があることです。これを行うには、background3Looperに属する別のHandlerを作成して投稿します。あなたはそれをやっていないので、2番目のThreadは何もせずに動き続けます。

Threadは本当にあなたの例がやっていることの全てであるハンドラ、別のThreadに投稿するだけでLooperを必要としません。それ以外のThread - この場合のメインのThreadは、すでにLooperを準備し始めています。あなたはそれにRunnableを送信しているだけです。そのためにはLooperは必要ありません。

+0

私は何かを十分に説明していないかどうかを知っています。 –

+0

マイクありがとうございました。あなたがコメントに投稿した他の投稿は、Looperがマネージャスレッドの一種としてあまりにも一般的であると説明しています。しかし、あなたの答えはそれを明確にしています。 –

+0

ああ、良い。お役に立てて嬉しいです。乾杯! –

関連する問題