android handler,Android中Handler原理
Handler主要是主線程和子線程通信。一般子線程中做一些耗時(shí)操作做完之后通知主線程來修改UI。
實(shí)際上android系統(tǒng)在Activity啟動(dòng)或者狀態(tài)變化等都是通過Handler機(jī)制實(shí)現(xiàn)的。
首先進(jìn)入到ActivityThread的main方法中
public static void main(String[] args) {
……
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
……
Looper.loop();
……
}
下面主要分析上面幾句代碼。
1.Looper.prepareMainLooper();
public static void prepareMainLooper() {
prepare(false);
synchronized (Looper.class) {
if (sMainLooper != null) {
throw new IllegalStateException("The main Looper has already been prepared.");
}
sMainLooper = myLooper();
}
}
private static void prepare(boolean quitAllowed) {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper(quitAllowed));//為這個(gè)線程會(huì)新建一個(gè)Looper對(duì)象
}
Looper的構(gòu)造函數(shù)如下
private Looper(boolean quitAllowed) {
mQueue = new MessageQueue(quitAllowed);//Looper維護(hù)了一個(gè)消息隊(duì)列
mRun = true;
mThread = Thread.currentThread();
}
小結(jié):在調(diào)用完Loop.prepare后,就會(huì)為當(dāng)前線程創(chuàng)建一個(gè)消息泵Looper,這個(gè)Looper維護(hù)了一個(gè)消息隊(duì)列MessageQueue
2. sMainThreadHandler =thread.getHandler();
sMainThreadHandler是Handler對(duì)象,getHandler方法如下:
final Handler getHandler() {
return mH;
}
看到mH在前面定義為final H mH = new H();實(shí)際上H是繼承自Handler。部分代碼如下:
private class H extends Handler {
public static final int LAUNCH_ACTIVITY = 100;
public static final int PAUSE_ACTIVITY = 101;
……
public void handleMessage(Message msg) {
if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
switch (msg.what) {
case LAUNCH_ACTIVITY: {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
ActivityClientRecord r = (ActivityClientRecord)msg.obj;
r.packageInfo = getPackageInfoNoCheck(
r.activityInfo.applicationInfo, r.compatInfo);
handleLaunchActivity(r, null);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
……
}
……
}
小結(jié):這里相當(dāng)于平時(shí)在UI線程中創(chuàng)建一個(gè)Handler實(shí)現(xiàn)他的handlerMessage方法。
3.Looper.loop();
public static void loop() {
……
final MessageQueue queue = me.mQueue;
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
return;
}
……
msg.target.dispatchMessage(msg);
……
msg.recycle();
}
}
小結(jié):調(diào)用Looper.loop(),可以看到for循環(huán),不停地從消息隊(duì)列中取消息,然后分發(fā)msg.target.dispatchMessage(msg); 這里的msg.target就是Handler對(duì)象,指的是處理該Message的Handler。
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
調(diào)用dispatchMessage,如果Message設(shè)置了回調(diào)函數(shù)就執(zhí)行回調(diào),否則如果定義Handler的時(shí)候如果傳進(jìn)了回調(diào)函數(shù)就執(zhí)行傳進(jìn)的回調(diào),不然就會(huì)執(zhí)行handlerMessage函數(shù),可以看到是有優(yōu)先級(jí)順序的。系統(tǒng)處理的時(shí)候由于未設(shè)置回調(diào),就會(huì)執(zhí)行handlerMessage。
比如上面的當(dāng)收到LAUNCH_ACTIVITY消息,就會(huì)執(zhí)行handleLaunchActivity---- performLaunchActivity---- mInstrumentation.newActivity(cl,component.getClassName(), r.intent); -----mInstrumentation.callActivityOnCreate(activity,r.state); ----- activity.performCreate(icicle);
這樣就執(zhí)行到了我們平時(shí)所謂的Activity的入口onCreate方法。
到現(xiàn)在我們看到了Handler機(jī)制在android中的應(yīng)用。接下來分析一下handler和Looper是怎么關(guān)聯(lián)起來的。
Handler的構(gòu)造函數(shù)最終都會(huì)去執(zhí)行
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();//獲取當(dāng)前線程的Looper
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;//將Looper對(duì)象的消息隊(duì)列傳給Handler的成員,使得Handler就可以操作該消息循環(huán)
mCallback = callback;
mAsynchronous = async;
}
Message類如下
public final class Message implements Parcelable {
public int what;
public int arg1;
public int arg2;
……
Handler target; //每個(gè)消息都有一個(gè)成員保存和他關(guān)聯(lián)的Handler
Runnable callback;
}
接下來我們看一下調(diào)用handler的sendMessage送消息時(shí)發(fā)生了什么
public final boolean sendMessage(Message msg)
{
return sendMessageDelayed(msg, 0);
}
最后會(huì)執(zhí)行到:
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;//在這里將this復(fù)制給Message的Handler成員,this也就是我們定義的handler對(duì)象。
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);//然后添加到消息隊(duì)列里面
}
msg.target = this;所以就有了在loop消息循環(huán)函數(shù)中的msg.target.dispatchMessage(msg);來分發(fā)消息。由于多臺(tái)就會(huì)執(zhí)行我們實(shí)現(xiàn)的handlerMessage里面的代碼。
總結(jié)
以上是生活随笔為你收集整理的android handler,Android中Handler原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 农行完成税务代扣交易是什么
- 下一篇: 个人贷款有哪几类