首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Android 判斷當前執行緒是否為主執行緒:Looper.myLooper() == Looper.getMainLooper() 最佳實踐

     編輯:Java 相關知識

標準判斷方法


public static boolean isInMainThread() {
    return Looper.myLooper() == Looper.getMainLooper();
}

原理:主執行緒啟動時系統呼叫 Looper.prepareMainLooper(),將主 Looper 存入靜態 sMainLooper 並綁定到主執行緒的 ThreadLocal。其他執行緒預設無 Looper(myLooper() 回傳 null),或手動 Looper.prepare() 建立專屬 Looper,皆與主 Looper 物件不同。

三種場景驗證

場景myLooper()getMainLooper()結果
主執行緒Looper{@40d35ef8}Looper{@40d35ef8}true
普通子執行緒nullLooper{@40d35ef8}false
HandlerThread / Looper.prepare()Looper{@40d72c58}Looper{@40d35ef8}false

原始碼追蹤


// Looper.java 關鍵片段
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<>();
private static Looper sMainLooper;

public static void prepareMainLooper() {
    prepare(false);
    synchronized (Looper.class) { sMainLooper = myLooper(); }
}

private static void prepare(boolean quitAllowed) {
    if (sThreadLocal.get() != null) throw new RuntimeException("Only one Looper per thread");
    sThreadLocal.set(new Looper(quitAllowed));
}

public static Looper myLooper() { return sThreadLocal.get(); }
public static Looper getMainLooper() { return sMainLooper; }

常見誤區

  • 判斷執行緒名稱:Thread.currentThread().getName().equals("main") 不可靠,名稱可被修改。
  • 用 Handler 建構子檢查:new Handler(Looper.getMainLooper()) 只能驗證能否向主執行緒送訊息,非判斷當前執行緒身分。

實務用法


if (isInMainThread()) {
    updateUI();
} else {
    new Handler(Looper.getMainLooper()).post(this::updateUI);
}

或搭配 runOnUiThread() (Activity)、View.post() 等封裝 API。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved