Android網(wǎng)絡(luò)通信基礎(chǔ)類源碼分析講解
應(yīng)用通信基礎(chǔ)架構(gòu)相關(guān)類源碼解析
這里主要對(duì)Android App開發(fā)時(shí),常用到的一些通信基礎(chǔ)類進(jì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
常見用法
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
}
});
}通過上述代碼中,可以看出。創(chuàng)建Handler時(shí)需要綁定Looper,也就是綁定到運(yùn)行的線程上。如過不指定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) {
// 沒有延時(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,可以通過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;
}
}
}常見的用法,比如在自定義的線程中。
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(); // 開始循環(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開發(fā)之Gradle?進(jìn)階Tasks深入了解
這篇文章主要為大家介紹了Android開發(fā)之Gradle?進(jìn)階Tasks深入了解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
談?wù)剬?duì)Android View事件分發(fā)機(jī)制的理解
本篇文章主要介紹了談?wù)剬?duì)Android View事件分發(fā)機(jī)制的理解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
Android應(yīng)用程序轉(zhuǎn)到后臺(tái)并回到前臺(tái)判斷方法
這篇文章主要介紹了Android應(yīng)用程序轉(zhuǎn)到后臺(tái)并回到前臺(tái)判斷方法的相關(guān)資料,需要的朋友可以參考下2016-11-11
Android JNI處理圖片實(shí)現(xiàn)黑白濾鏡的方法
這篇文章主要介紹了Android JNI處理圖片實(shí)現(xiàn)黑白濾鏡的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01
Android實(shí)現(xiàn)繪制折線圖APP代碼
大家好,本篇文章主要講的是Android實(shí)現(xiàn)繪制折線圖APP代碼,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02
Android中button實(shí)現(xiàn)onclicklistener事件的兩種方式
本文介紹下Android中button實(shí)現(xiàn)onclicklistener事件的兩種方法,感興趣的朋友可以參考下2013-04-04
Android性能優(yōu)化之捕獲java crash示例解析
這篇文章主要介紹了Android性能優(yōu)化之捕獲java crash示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Android如何調(diào)整線程調(diào)用棧大小
這篇文章主要介紹了Android如何調(diào)整線程調(diào)用棧大小,幫助大家更好的進(jìn)行Android開發(fā),完善自身程序,感興趣的朋友可以了解下2020-10-10

