Handler简介:
一个Handler和线程,消息队列关联起来,允许你发送,处理,Message和Runnable。每个Handler实例和单独的线程,消息队列关联,当你创建一个新的handler,它就绑定到了消息队列(当前线程),它将传递Message和Runnable,执行它们当Message和Runnable从消息队列中出来的时候。
其主要有2种用途;1:在未来执行一个Message或者runnable。2:将一个需要执行的action从一个不用的线程中放入一个队列中。
当应用进程被创建的时候,在activities, broadcast receivers, etc(任何window被创建)中就有了消息队列。你可以在自己的thread(子线程)中创建,通过handler可以和主线程关联起来。通过post,sendMessage来实现。
sendMessage可以携带bundle,需要实现handler来完成。
主要方法介绍:
1:子类必须实现的方法
public void handleMessage(Message msg) {}
2:处理消息
/*** Handle system messages here.*/public void dispatchMessage(Message msg) {if (msg.callback != null) {handleCallback(msg);} else {if (mCallback != null) {if (mCallback.handleMessage(msg)) {return;}}handleMessage(msg);}}
3:系列方法obtainMessage,都是调用了Message的同名方法。
public final Message obtainMessage(int what, int arg1, int arg2, Object obj){return Message.obtain(this, what, arg1, arg2, obj);}public static Message obtain(Handler h, int what,int arg1, int arg2, Object obj) {Message m = obtain();m.target = h;m.what = what;m.arg1 = arg1;m.arg2 = arg2;m.obj = obj;return m;}
4:系列方法post
public final boolean postDelayed(Runnable r, long delayMillis){return sendMessageDelayed(getPostMessage(r), delayMillis);}private static Message getPostMessage(Runnable r) {Message m = Message.obtain();m.callback = r;return m;}
可以看出,post也是通过Message来实现的。将runnable,obj封装成Message。
5:系列方法send
无论是sendEmptyMessage还是sendMessageDelayed,都是执行了sendMessageAtTime方法。
public boolean sendMessageAtTime(Message msg, long uptimeMillis) {MessageQueue queue = mQueue;if (queue == null) {RuntimeException e = new RuntimeException(this + " sendMessageAtTime() called with no mQueue");Log.w("Looper", e.getMessage(), e);return false;}return enqueueMessage(queue, msg, uptimeMillis);}private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {msg.target = this;if (mAsynchronous) {msg.setAsynchronous(true);}return queue.enqueueMessage(msg, uptimeMillis);}
6:在activity的onDestory中执行removeCallbacksAndMessages方法,参数为null,移除所有的callback及message。
Message简介:
Message可以包含int字段,object,callback,通过handler来传递数据。尽管Message的方法是public的,可是最好的方法是通过Message.obtain(),或者Handler.obtainMessage()。因为这个是从一个可以被回收利用的pool中获取的。
message也可以发送Message。其实,还是通过handler来完成的。
public void sendToTarget() {target.sendMessage(this);}
总结:
到最后,都是获取MessageQueue然后执行enqueueMessage方法来实现的。无论是send,post,或者message的send,是否有延迟的。
791

被折叠的 条评论
为什么被折叠?



