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);
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.
java.lang.Object | |
↳ | android.os.MessageQueue |
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 by
uptimeMillis.
|
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 by
uptimeMillis.
|
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