2016-10-04 4 views
2

スレッド、ビュー、またはアクティビティの間でメッセージを送信する場合、2つの一見同じ方法があります。sendToTargetとsendMessageの違い

その後、HandlersendMessageメソッドを使用し、最初の、そして私に最も直感的には、obtainMessageです:

Message msgNextLevel = Message.obtain(); 
msgNextLevel.what = m.what; 
mParentHandler.sendMessage(msgNextLevel); 

それとも、あなたが使用し、Handlerを提供するメッセージをobtainできますMessageさんsendToTarget方法:

Message msg = Message.obtain(parentHandler); 
msg.what = 'foo'; 
msg.sendToTarget(); 

なぜ同じことを達成するためのこれらの二つの方法が存在するのですか?彼らは異なった振る舞いをしていますか?

+3

http://androidxref.com/7.0.0_r1/xref/frameworks/base/core/java/android/os/Message.java#415 – pskink

+0

また、アクティビティ間でメッセージを送信することはできません – Selvin

+0

@pskink Aha、so 'sendToTarget'は実際には*、' sendMessage'です。 'obtain()'と 'get(Handler)'はどうでしょうか? – LondonRob

答えて

2

あなたはhereから例えばMessage.javaコードをチェックする場合は、sendToTarget()は、以前に指定Handlerを使用して、obtain()を探している場合、そのsendMessage()

を起動する、つまり

//Sends this Message to the Handler specified by getTarget(). 


public void sendToTarget() { 
    target.sendMessage(this); 
} 

が表示されます方法をご覧ください:

public static Message obtain() { 
    synchronized (sPoolSync) { 
     if (sPool != null) { 
      Message m = sPool; 
      sPool = m.next; 
      m.next = null; 
      m.flags = 0; // clear in-use flag 
      sPoolSize--; 
      return m; 
     } 
    } 
    return new Message(); 
} 

説明が表示されます

グローバルプールから新しいメッセージインスタンスを返します。 を回避することができます 多くの場合、新しいオブジェクトを割り当てる

obtain(Handler h)のために同じことを行う

public static Message obtain(Handler h) { 
    Message m = obtain(); 
    m.target = h; 

    return m; 
} 

あなたはobtain(Handler h)が本当には(取得と同じHandler

目標を設定するのに加えてobtain()あることを確認することができる)が、返されるMessageにターゲットメンバの値を設定します。

他のいくつかのオーバーロードはちょうどMessage.javaをチェックして

  • obtain(Message orig)
  • obtain(Handler h, Runnable callback)
  • obtain(Handler h, int what)
  • obtain(Handler h, int what, Object obj)
  • obtain(Handler h, int what, int arg1, int arg2)
  • "を取得" を検索し、存在します
  • obtain(Handler h, int what, int arg1, int arg2, Object obj)
  • ...

これは、歓声を役に立てば幸い!

0

メッセージは内部プールから取得されるため、ガベージコレクションのオーバーヘッドは発生しません。 Message.obtain(Hanler)を呼び出すと、メッセージはハンドラの受信者を認識し、msg.sendToTarget()を呼び出すと、そのハンドラに渡されます。 AndroidのMessageクラスとHandlerクラスの代わりに並行性を整理するためにrxJavaライブラリを使用することを検討する必要があります。これはもっと便利で、molexを使えるようになります。

関連する問題