日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

android handler,Android中Handler原理

發(fā)布時(shí)間:2024/10/8 Android 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android handler,Android中Handler原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。