2016-10-04 2 views
2

При отправке сообщения между Threads, Views или Activities есть два, казалось бы, одинаковых способа сделать это.Разница между sendToTarget и sendMessage

Первый, и мне наиболее интуитивно, это obtainMessage, а затем использовать Handler «s sendMessage метод:

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

Или, вы можете obtain сообщение, обеспечивающий Handler, а затем использовать Message «s 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, поэтому 'sendToTarget' действительно * есть *,' sendMessage'. Как насчет 'get()' vs. 'get (Handler)'? – LondonRob

ответ

2

Если вы проверяете Message.java код, например, из here вы увидите

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


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

Другими словами, sendToTarget() будет использовать ранее запрограммированная Handler и вызывать его sendMessage()

Если посмотреть на obtain() метод вы увидите:

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) действительно являетсяobtain() с добавлением установки цели Handler

То же, получаем(), но устанавливает значение для целевого члена в возвращаемом сообщении.

Есть несколько других перегруженных, просто проверить 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(), он доставляется этому обработчику. Вы должны использовать библиотеку rxJava для организации параллелизма вместо классов Message and Handler для Android - это более удобно, и вы сможете делать с ним сложные вещи.

Смежные вопросы