Handler
extends Objectjava.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 Objectjava.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 Objectjava.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