Handler
extends Object| java.lang.Object | |
| ↳ | android.os.Handler |
Class Overview
A Handler allows you to send and process Message and Runnable objects associated with a thread'sMessageQueue. Each Handler instance is associated with a single thread and that thread's message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it -- from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue.
mHandler = new Handler(){public void handleMessage(Message msg){
//int android.os.Message.what
//User-defined message code so that the recipient can identify what this message is about.
switch(msg.what){case UPDATE_TEXT:mTextView.setText("text changed");break;default:break;}}};public final boolean sendMessage(Message msg)Added inAPI level 1
Pushes a message onto the end of the message queue after all pending messages before the current time. It will be received inhandleMessage(Message), in the thread attached to this handler.
Returns
- 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.
Message mMessage = Message.obtain(mHandler, UPDATE_TEXT);//Pushes a message onto the end of the message queue after all pending messages before the current time.
mHandler.sendMessage(mMessage);
2、
Looper
extends Object| java.lang.Object | |
| ↳ | android.os.Looper |
Class Overview
Class used to run a message loop for a thread. Threads by default do not have a message loop associated with them; to create one, callprepare() in the thread that is to run the loop, and thenloop() to have it process messages until the loop is stopped.
Most interaction with a message loop is through the Handler class.
MessageQueue
extends Object| java.lang.Object | |
| ↳ | android.os.MessageQueue |
Message
extends Objectimplements Parcelable
| java.lang.Object | |
| ↳ | android.os.Message |
Class Overview
Defines a message containing a description and arbitrary data object that can be sent to aHandler. This object contains two extra int fields and an extra object field that allow you to not do allocations in many cases.
//Message android.os.Message.obtain(Handler h, int what)
Message mMessage = Message.obtain(mHandler, UPDATE_TEXT);Message是在线程之间传递消息,它可以在内部携带少量信息,如what字段、arg1、arg2来携带一些整型数据、obj携带Object对象,用于在不同线程间交换数据。Message mMessage = Message.obtain();
Bundle bundle = new Bundle();
bundle.putString("key","这里一切安全");
mMessage.what = 0;
mMessage.obj = bundle;通常会用obtain()方法创建Message,如果消息池中有Message则取出,没有则创建,这样防止对象重复创建,节省资源。
/*** Return a new Message instance from the global pool. Allows us to* avoid allocating new objects in many cases.*/public static Message obtain() {synchronized (sPoolSync) {if (sPool != null) {Message m = sPool;sPool = m.next;m.next = null;sPoolSize--;return m;}}return new Message();}“铃铃铃……”,小mMessage接到一个店换,"我叫Handler,来此Activity大本营,是你这次任务的接收者,一会我会带你去首都的消息中心去报道。"
mHandler = new Handler(){public void handleMessage(Message msg){
//int android.os.Message.what
//User-defined message code so that the recipient can identify what this message is about.}};Handler属于Activity,创建任何一个Handler都属于重写了Activity的Handler。在Handler的构造中,默认完成了对当前线程Looper的绑定。
public Handler(Callback callback, boolean async) {if (FIND_POTENTIAL_LEAKS) {final Class<? extends Handler> klass = getClass();if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&(klass.getModifiers() & Modifier.STATIC) == 0) {Log.w(TAG, "The following Handler class should be static or leaks might occur: " +klass.getCanonicalName());}}mLooper = Looper.myLooper();if (mLooper == null) {throw new RuntimeException("Can't create handler inside thread that has not called Looper.prepare()");}mQueue = mLooper.mQueue;mCallback = callback;mAsynchronous = async;} | static Looper | myLooper() Return the Looper object associated with the current thread. |
| static MessageQueue | myQueue() Return the MessageQueue object associated with the current thread. |
mHandler神情骄傲的对小mMessage说:我已经跟首都的消息中心打好了招呼,准备接收你了,现在有两种车“send”和“post”你想坐哪辆都可以,不过要根据你上司的命令选择对应的型号哦~
| final boolean | post(Runnable r) Causes the Runnable r to be added to the message queue. |
| final boolean | postAtFrontOfQueue(Runnable r) Posts a message to an object that implements Runnable. |
| final boolean | postAtTime(Runnable r,Object token, long uptimeMillis) Causes the Runnable r to be added to the message queue, to be run at a specific time given byuptimeMillis. |
| final boolean | postAtTime(Runnable r, long uptimeMillis) Causes the Runnable r to be added to the message queue, to be run at a specific time given byuptimeMillis. |
| final boolean | postDelayed(Runnable r, long delayMillis) Causes the Runnable r to be added to the message queue, to be run after the specified amount of time elapses |
| final boolean | sendEmptyMessage(int what) Sends a Message containing only the what value. |
| final boolean | sendEmptyMessageAtTime(int what, long uptimeMillis) Sends a Message containing only the what value, to be delivered at a specific time. |
| final boolean | sendEmptyMessageDelayed(int what, long delayMillis) Sends a Message containing only the what value, to be delivered after the specified amount of time elapses. |
| final boolean | sendMessage(Message msg) Pushes a message onto the end of the message queue after all pending messages before the current time. |
| final boolean | sendMessageAtFrontOfQueue(Message msg) Enqueue a message at the front of the message queue, to be processed on the next iteration of the message loop. |
| boolean | sendMessageAtTime(Message msg, long uptimeMillis) Enqueue a message into the message queue after all pending messages before the absolute time (in milliseconds)uptimeMillis. |
| final boolean | sendMessageDelayed(Message msg, long delayMillis) Enqueue a message into the message queue after all pending messages before (current time + delayMillis). |
| String | toString() |
Looper.prepare(); | static void | prepareMainLooper() Initialize the current thread as a looper, marking it as an application's main looper. |
Looper的构造方法中,创建了和他一一对应的MessageQueue
private Looper(boolean quitAllowed){mQueue = new MessageQueue(quitAllowed);mThread = Thread.currentThread();
}在Android中ActivityThread的main方法是程序入口,主线程的Looper和MessageQueue就是在此刻创建。
public static void loop()
Run the message queue in this thread. Be sure to callquit() to end the loop.
public void dispatchMessage(Message msg){
if(msg.callback != null){
handleCallback.handleMessage(msg);
}else{
if(mCallback != null){
if(mCallback.handleMessage(msg)){
return;}
}
handleMessage(msg);
}
} Thanks to MeloDev、stromzhang