android - 菜鸟对于 handler发送msg的疑问。

【字号: 日期:2022-12-16浏览:29作者:雯心

问题描述

handler.sendEmpityMessage();和handler.obtainMessage(1,data).sendToTarget();有什么不同

问题解答

回答1:

第二个方法可以对所发送的消息进行判断,从而进行不同的处理。如果没有分类处理的需求,发一个空消息就够了。

回答2:

从源码看先是sendEmptyMessage(int what)

public final boolean sendEmptyMessage(int what) {return sendEmptyMessageDelayed(what, 0); }

再点进sendEmptyMessageDelayed(what, 0)

/** * Sends a Message containing only the what value, to be delivered * after the specified amount of time elapses. * @see #sendMessageDelayed(android.os.Message, long) * * @return Returns true if the message was successfully placed in to the * message queue. Returns false on failure, usually because the * looper processing the message queue is exiting. */ public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {Message msg = Message.obtain();msg.what = what;return sendMessageDelayed(msg, delayMillis); }

从sendEmptyMessageDelayed(int what, long delayMillis)方法中可以看到what参数赋给了obtain出来的Message对象

再从obtainMessage(1,data)的源码中看

/** * * Same as {@link #obtainMessage()}, except that it also sets the what and obj members * of the returned Message. * * @param what Value to assign to the returned Message.what field. * @param obj Value to assign to the returned Message.obj field. * @return A Message from the global message pool. */ public final Message obtainMessage(int what, Object obj) {return Message.obtain(this, what, obj); }

方法返回Message.obtain(this, what, obj),接着继续看obtain(this, what, obj)

public static Message obtain(Handler h, int what, Object obj) {Message m = obtain();m.target = h;m.what = what;m.obj = obj;return m; }

方法里面Message也是通过obtain来获取的,不过这里还将obj对象赋给了Message。sendToTarget()的源码中的target是Handler,就是调用了sendMessage()方法

/** * Sends this Message to the Handler specified by {@link #getTarget}. * Throws a null pointer exception if this field has not been set. */ public void sendToTarget() {target.sendMessage(this); }

public final boolean sendMessage(Message msg) {return sendMessageDelayed(msg, 0); }

sendEmptyMessage(int what)和obtainMessage(int what, Object obj).sendToTarget()最大的不同就是没有了Object这个对象

参考:Handler 的sendEmptyMessage(int what)和sendMessage(Message msg)有啥区别?Handler sendMessage 与 obtainMessage (sendToTarget)比较

回答3:

没啥太大不同,第一个是发送空消息,第二个是从消息池取一个消息发送。

回答4:

没什么不同,只是提供了多样的API给你用,你怎么用的习惯就怎么用

相关文章: