Android網(wǎng)絡(luò)通信基礎(chǔ)類源碼分析講解
應(yīng)用通信基礎(chǔ)架構(gòu)相關(guān)類源碼解析
這里主要對(duì)Android App開(kāi)發(fā)時(shí),常用到的一些通信基礎(chǔ)類進(jìn)行一下源碼的簡(jiǎn)單分析,包括:
- Handler:處理器,與某個(gè)Looper(一個(gè)線程對(duì)應(yīng)一個(gè)Looper)進(jìn)行關(guān)聯(lián)。用于接收消息,并在關(guān)聯(lián)的Looper,處理消息。
- Looper:驅(qū)動(dòng)器,驅(qū)動(dòng)基于事件的消息系統(tǒng)(通信架構(gòu)的核心)其實(shí)現(xiàn)在Native層,基于epoll機(jī)制(感興趣的可自行了解)。
- Runnable: 表示“可執(zhí)行的代碼”,本質(zhì)是Interface,規(guī)定了Run這個(gè)接口。
- MessageQueue: 消息隊(duì)列,提供了入隊(duì)、出隊(duì)等操作。一個(gè)線程,只能有一個(gè)MessageQueue。
- Thread: 線程類,封裝了線程相關(guān)操作。
基于Android12代碼。
類圖:

Handler
常見(jiàn)用法
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
// 處理消息
}
};
private void sendMessage() {
// 發(fā)送消息
Message msg = mHandler.obtainMessage();
// 填充msg
mHandler.sendMessage(msg);
}
private void postRunnable() {
// 告知Handler一段可執(zhí)行的代碼(Runnable)
mHandler.post(new Runnable() {
@Override
public void run() {
// do something
}
});
}通過(guò)上述代碼中,可以看出。創(chuàng)建Handler時(shí)需要綁定Looper,也就是綁定到運(yùn)行的線程上。如過(guò)不指定looper,使用創(chuàng)建handler時(shí)所在線程的Looper。
源碼定義在 frameworks/base/core/java/android/os/Handler.java
public Handler() {
this(null, false);
}
public Handler(@NonNull Looper looper) {
this(looper, null, false);
}
public Handler(@Nullable 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());
}
}
// 獲取當(dāng)前線程對(duì)應(yīng)的Looper
mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread " + Thread.currentThread()
+ " that has not called Looper.prepare()");
}
// 使用Looper中的MessageQueue
mQueue = mLooper.mQueue;
mCallback = callback;
mAsynchronous = async;
}
@UnsupportedAppUsage
public Handler(@NonNull Looper looper, @Nullable Callback callback, boolean async) {
mLooper = looper;
mQueue = looper.mQueue;
mCallback = callback;
mAsynchronous = async;
}調(diào)用Handler的sendMessage,到Handler處理(handleMessage)這個(gè)Message。Handler會(huì)將這個(gè)Message,入隊(duì)到綁定的Looper的MessageQueue(消息隊(duì)列中)。
public final boolean sendMessage(@NonNull Message msg) {
// 沒(méi)有延時(shí)
return sendMessageDelayed(msg, 0);
}
public final boolean sendMessageDelayed(@NonNull Message msg, long delayMillis) {
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) {
MessageQueue queue = mQueue;
if (queue == null) {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
return false;
}
return enqueueMessage(queue, msg, uptimeMillis);
}
private boolean enqueueMessage(@NonNull MessageQueue queue, @NonNull Message msg,
long uptimeMillis) {
msg.target = this;
// 記錄一下UID
msg.workSourceUid = ThreadLocalWorkSource.getUid();
if (mAsynchronous) {
msg.setAsynchronous(true);
}
// 消息入隊(duì)MessageQueue
return queue.enqueueMessage(msg, uptimeMillis);
}Looper從MessageQueue中依次取出Message,并告知Handler的handleMessage處理消息(想要看懂looper,涉及到其Native實(shí)現(xiàn),這里不分析,可自行了解)
Looper
Looper類基于epoll機(jī)制,提供了一套事件驅(qū)動(dòng)機(jī)制。Java層的實(shí)現(xiàn)在frameworks/base/core/java/android/os/Looper.java,該類中的sMainLooper變量存儲(chǔ)了 主線程(或者叫UI線程)對(duì)應(yīng)的Looper,可以通過(guò)getMainLooper取得。
public final class Looper {
private static final String TAG = "Looper";
// sThreadLocal.get() will return null unless you've called prepare().
@UnsupportedAppUsage
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
@UnsupportedAppUsage
private static Looper sMainLooper; // guarded by Looper.class
// 省略
public static Looper getMainLooper() {
synchronized (Looper.class) {
return sMainLooper;
}
}
}常見(jiàn)的用法,比如在自定義的線程中。
public class MyThread extends Thread {
private Handler mHandler;
@Override
public void run() {
Looper.prepare(); // 準(zhǔn)備Looper
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 處理消息
}
}
};
Looper.loop(); // 開(kāi)始循環(huán),等待消息
}
}Looper的實(shí)現(xiàn)這里就不分析了,路徑在**/frameworks/base/core/java/android/os/Looper.java**,可自行了解(建議先掌握epoll)
Thread
Android Thread類提供線程功能,其定義在 libcore/ojluni/src/main/java/java/lang/Thread.java
public
class Thread implements Runnable {
public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
}
}
調(diào)用start方法,可以啟動(dòng)線程,比如上面定義的MyThread類。
MyThread thr = new MyThread(); thr.start();
其提供了一些方法,用于控制線程,比如
- sleep: 讓線程等待一段時(shí)間
- jion:等待線程退出(或者叫執(zhí)行完成)
- interrupt:打斷線程。
注意:Thread和Looper是兩個(gè)事情,其關(guān)系是一對(duì)一。 Thread就是常規(guī)意義上的線程,程序代碼最小的運(yùn)行單位(先不考慮協(xié)程),Looper是一套基于消息(事件)的驅(qū)動(dòng)機(jī)制。
Runnable是一個(gè)接口類,規(guī)定了Run這個(gè)方法。MessageQueue是一個(gè)消息隊(duì)列。這個(gè)類功能比較單一。其源碼路徑如下,感興趣的可自行了解。
- /frameworks/base/core/java/android/os/MessageQueue.java
- /libcore/ojluni/src/main/java/java/lang/Runnable.java
再貼一遍類圖,加深理解。

以上就是Android網(wǎng)絡(luò)通信基礎(chǔ)類源碼分析講解的詳細(xì)內(nèi)容,更多關(guān)于Android網(wǎng)絡(luò)通信的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android自定義PopupWindow實(shí)現(xiàn)炫酷的IOS對(duì)話框效果
這篇文章主要給大家介紹如何在android中實(shí)現(xiàn)高仿ios對(duì)話框效果,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-05-05
Android編程之簡(jiǎn)單逐幀動(dòng)畫Frame的實(shí)現(xiàn)方法
這篇文章主要介紹了Android編程之簡(jiǎn)單逐幀動(dòng)畫Frame的實(shí)現(xiàn)方法,結(jié)合實(shí)例較為詳細(xì)的分析了Android逐幀動(dòng)畫的原理、步驟與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-12-12
android實(shí)現(xiàn)多點(diǎn)觸摸應(yīng)用
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)多點(diǎn)觸摸應(yīng)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Android ListView常見(jiàn)的優(yōu)化方式詳解
這篇文章主要介紹了Android ListView常見(jiàn)的優(yōu)化方式詳解的相關(guān)資料,需要的朋友可以參考下2017-02-02
Android組件Glide實(shí)現(xiàn)圖片平滑滾動(dòng)效果
這篇文章主要介紹了Android組件Glide實(shí)現(xiàn)圖片平滑滾動(dòng)效果的相關(guān)資料,具有一定的參考價(jià)值,需要的朋友可以參考下2016-07-07
Android實(shí)現(xiàn)系統(tǒng)重新啟動(dòng)的功能
有些Android版本沒(méi)有系統(tǒng)重啟的功能,非常不方便。需要我們自己開(kāi)發(fā)一個(gè)能夠重新啟動(dòng)的應(yīng)用2013-11-11
Android LeakCanary檢測(cè)內(nèi)存泄露原理
這篇文章主要介紹了分析LeakCanary檢測(cè)內(nèi)存泄露原理,幫助大家更好的理解和學(xué)習(xí)使用Android開(kāi)發(fā),感興趣的朋友可以了解下2021-03-03

