日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 异步操作】Handler ( 主线程中的 Handler 与 Looper | Handler 原理简介 )

發布時間:2025/6/17 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 异步操作】Handler ( 主线程中的 Handler 与 Looper | Handler 原理简介 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、主線程中的 Handler 與 Looper
  • 二、Handler 原理簡介





一、主線程中的 Handler 與 Looper



Android 系統中 , 點擊圖標啟動一個應用進程 , 就是從 Linux 的 Zygote 進程 fork 一個子進程 , 之后該子進程就會創建 ActivityThread , 執行其中的 main 函數 , 該 main 函數就是應用的主線程 ;


Android 的主線程在 ActivityThread 中創建并維護 , 在該類中的 main 函數 , 就是 Activity 中的主函數 ;

在該主函數中 , 調用 Looper.prepareMainLooper() 準備主線程 Looper ;

在最后的地方調用 Looper.loop() , 無限循環消息隊列中的消息 ;

public final class ActivityThread extends ClientTransactionHandler {public static void main(String[] args) {Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");// CloseGuard defaults to true and can be quite spammy. We// disable it here, but selectively enable it later (via// StrictMode) on debug builds, but using DropBox, not logs.CloseGuard.setEnabled(false);Environment.initForCurrentUser();// Set the reporter for event logging in libcoreEventLogger.setReporter(new EventLoggingReporter());// Make sure TrustedCertificateStore looks in the right place for CA certificatesfinal File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());TrustedCertificateStore.setDefaultUserDirectory(configDir);Process.setArgV0("<pre-initialized>");// 獲取主線程 Handler 對應的 Looper Looper.prepareMainLooper();// Find the value for {@link #PROC_START_SEQ_IDENT} if provided on the command line.// It will be in the format "seq=114"long startSeq = 0;if (args != null) {for (int i = args.length - 1; i >= 0; --i) {if (args[i] != null && args[i].startsWith(PROC_START_SEQ_IDENT)) {startSeq = Long.parseLong(args[i].substring(PROC_START_SEQ_IDENT.length()));}}}ActivityThread thread = new ActivityThread();thread.attach(false, startSeq);if (sMainThreadHandler == null) {sMainThreadHandler = thread.getHandler();}if (false) {Looper.myLooper().setMessageLogging(newLogPrinter(Log.DEBUG, "ActivityThread"));}// End of event ActivityThreadMain.Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);// 無限循環獲取任務并執行 Looper.loop();throw new RuntimeException("Main thread loop unexpectedly exited");} }

源碼參考 : android/9.0.0_r8/xref/frameworks/base/core/java/android/app/ActivityThread.java





二、Handler 原理簡介



Handler 主要作用是 , 用于 線程間通信 ,

在線程 AAA 中創建 Handler , 在其它線程中使用 Handler 對象發送消息給 AAA 線程的 MessageQueue 消息隊列 ,

線程 AAA 中的 Looper 不停地從 消息隊列 ( MessageQueue ) 中取出 Message 消息 , 然后進行分發 ;


在線程 AAA 中使用 Handler , 首先要調用 Looper.prepare()方法 , 該方法的作用是準備輪詢器 ,

Looper 創建后 , 會放在 ThreadLocal 中 , 這是線程的變量表 , 每個線程都有一個線程 ThreadLocal ,

使用線程 AAA 時 , 拿到 AAA 線程的 Looper , 在其它線程中調用 Handler 的 sendMessage 方法 ,

將消息傳遞給線程 AAA 中的 消息隊列 ( MessageQueue ) 中 ,

Looper 中維護了一個 消息隊列 ( MessageQueue ) , MessageQueue 封裝在 Looper 中 ;


更多細節參考 : 【Android】Handler 機制 ( Handler | Message | Looper | MessageQueue )

總結

以上是生活随笔為你收集整理的【Android 异步操作】Handler ( 主线程中的 Handler 与 Looper | Handler 原理简介 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。