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