亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

應(yīng)用通信基礎(chǔ)架構(gòu)相關(guān)類源碼解析

這里主要對Android App開發(fā)時,常用到的一些通信基礎(chǔ)類進行一下源碼的簡單分析,包括:

  • Handler:處理器,與某個Looper(一個線程對應(yīng)一個Looper)進行關(guān)聯(lián)。用于接收消息,并在關(guān)聯(lián)的Looper,處理消息。
  • Looper:驅(qū)動器,驅(qū)動基于事件的消息系統(tǒng)(通信架構(gòu)的核心)其實現(xiàn)在Native層,基于epoll機制(感興趣的可自行了解)。
  • Runnable: 表示“可執(zhí)行的代碼”,本質(zhì)是Interface,規(guī)定了Run這個接口。
  • MessageQueue: 消息隊列,提供了入隊、出隊等操作。一個線程,只能有一個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時需要綁定Looper,也就是綁定到運行的線程上。如過不指定looper,使用創(chuàng)建handler時所在線程的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)前線程對應(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)這個Message。Handler會將這個Message,入隊到綁定的Looper的MessageQueue(消息隊列中)。

public final boolean sendMessage(@NonNull Message msg) {
	 // 沒有延時 
     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);
    }
    // 消息入隊MessageQueue
    return queue.enqueueMessage(msg, uptimeMillis);
}

Looper從MessageQueue中依次取出Message,并告知Handler的handleMessage處理消息(想要看懂looper,涉及到其Native實現(xiàn),這里不分析,可自行了解)

Looper

Looper類基于epoll機制,提供了一套事件驅(qū)動機制。Java層的實現(xiàn)在frameworks/base/core/java/android/os/Looper.java,該類中的sMainLooper變量存儲了 主線程(或者叫UI線程)對應(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的實現(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方法,可以啟動線程,比如上面定義的MyThread類。

MyThread thr = new MyThread();
thr.start();

其提供了一些方法,用于控制線程,比如

  • sleep: 讓線程等待一段時間
  • jion:等待線程退出(或者叫執(zhí)行完成)
  • interrupt:打斷線程。

注意:Thread和Looper是兩個事情,其關(guān)系是一對一。 Thread就是常規(guī)意義上的線程,程序代碼最小的運行單位(先不考慮協(xié)程),Looper是一套基于消息(事件)的驅(qū)動機制。

Runnable是一個接口類,規(guī)定了Run這個方法。MessageQueue是一個消息隊列。這個類功能比較單一。其源碼路徑如下,感興趣的可自行了解。

  • /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ò)通信的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論