2011-07-24 4 views
1

私は本を介してAndroidを学習することはできません。私は簡単な質問があります。私の本のコードは非常にシンプルで、次のようになります。Android、私の本からの簡単な質問

マイハンドラ:

Handler handler=new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     bar.incrementProgressBy(5); 
       } 
    }; 

マイスレッド:

Thread background=new Thread(new Runnable() { 
      public void run() { 
      try { 
       for (int i=0;i<20 && isRunning.get();i++) { 
       Thread.sleep(1000); 
       handler.sendMessage(handler.obtainMessage()); 
       } 
      } 
      catch (Throwable t) { 
       // just end the background thread 
      } 
      } 
     }); 

私の質問はここにある:

handler.sendMessage(handler.obtainMessage()); 

一体何"handler.obtainMessage()"ですか?
Eclipseでマウスを動かすと、わかりにくいようなメッセージが表示されます。
"取得"しようとするメッセージはありますか?

+0

のsendMessageは、単純な文字列を送信する必要があります。ですから、私はobtainMessage()はあなた自身の定数文字列を取得するべきだと思います。 – papachan

答えて

3

in the docsのように、メッセージプールから新しいメッセージを作成する代わりにメッセージを取得します。 (とにかくハンドラにメッセージを送信する必要があります)。

グローバルメッセージプールから新しいメッセージを返します。新しいインスタンスの作成と割り当てよりも効率的な 。取得されたメッセージのハンドラは、このインスタンスに設定された (Message.target == this)です。 その施設が必要ない場合は、代わりにMessage.obtain()を呼び出してください。

私は詳しく説明しようとするでしょう:

あなたはハンドラにメッセージを送信します。メッセージは、ハンドラのスレッドキューに追加され、元のスレッドで処理されます。あなたはメッセージを送信する必要がありますが、それはあなたのハンドラコードに応じて使用するメッセージに固有のものはありませんが、空のメッセージを送信するだけです。新しいメッセージにメモリを割り当てる代わりに、メッセージは速いメッセージプール。

これにより、わかりやすくなります。 int型とメッセージを設定する方法について

Message m = new Message(); 
Bundle b = new Bundle(); 
b.putInt("what", 5); // for example 
m.setData(b); 
handler.sendMessage(m); 
+0

私はOPと書かれたgoogleとEclipseを介して同様の説明をしています。もう少し詳しく説明できますか? – Ryan

+0

@Ryan - 編集を参照してください。 – MByD

+0

ありがとう!それはもう少し意味がある、私はあなたの答えを選択しましたが、あなたが私に関連する1つのqに答えることができればそれを感謝するでしょう...今私は(あなたが言ったように)メッセージに特有のものは何もありません。私はsendmessageでintを送信しようとしましたが、うまくいきませんでした... – Ryan