【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 原理简介 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【词汇】preci-词根、ap-前缀、d
- 下一篇: 【Android 异步操作】手写 Han