欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android網(wǎng)絡(luò)通信基礎(chǔ)類源碼分析講解

 更新時(shí)間:2024年05月04日 12:21:00   作者:林多  
這篇文章主要介紹了Android網(wǎng)絡(luò)通信基礎(chǔ)類源碼,包括了Handler、Looper、Thread的分析講解,對(duì)日常開(kāi)發(fā)學(xué)習(xí)很有幫助,需要的朋友可以參考下

應(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)文章

最新評(píng)論