搜尋

首頁  >  問答  >  主體

为什么Android系统会给程序的主线程自动添加Looper?

如何实现自动添加的?

大家讲道理大家讲道理2772 天前641

全部回覆(2)我來回復

  • PHP中文网

    PHP中文网2017-04-17 15:03:49

    Android 在進程的入口函數 ActivityThread.main()中,呼叫 Looper.prepareMainLooper, 為應用程式的主執行緒建立Looper,然後呼叫Looper.loop()就啟動了進程的訊息循環,然後就可以處理訊息了。

    ActivityThread原始碼:

    151 public final class ActivityThread {
    
    2202    private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    2253            if (activity != null) {
    2259                activity.attach(appContext, this, ..., );
    
    5219    public static void main(String[] args) {
                // 在这儿调用 Looper.prepareMainLooper, 为应用的主线程创建Looper
    5240        Looper.prepareMainLooper();
    5242        ActivityThread thread = new ActivityThread();
    5245        if (sMainThreadHandler == null) {
    5246            sMainThreadHandler = thread.getHandler();
    5247        }
    5254        Looper.loop();
    5257    }
    5258}

    Looper源碼:

    52 public final class Looper {
            // Initialize the current thread as a looper, marking it as an application's main looper.
            // The main looper for your application is created by the Android environment,
            // so you should never need to call this function yourself. See also: prepare()        
    87     public static void prepareMainLooper() {
    88         prepare(false);
    89         synchronized (Looper.class) {
    90             if (sMainLooper != null) {
    91                 throw new IllegalStateException("The main Looper has already been prepared.");
    92             }
    93             sMainLooper = myLooper();
    94         }
    95     }

    Activity源碼:

    660 public class Activity extends ContextThemeWrapper {
    699     /*package*/ ActivityThread mMainThread;
    
    5922    final void attach(Context context, ActivityThread aThread, ..., ) {
    5944        mMainThread = aThread;

    參考:

    http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/app/ActivityThread.java
    http://grepcode .com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/app/Activity.java
    Android應用程式進程啟動過程的原始程式碼分析- by 羅升陽
    Android_Message_Handler_訊息處理機制總結筆記

    回覆
    0
  • 迷茫

    迷茫2017-04-17 15:03:49

    @li21 講的很好,
    順便跟樓主說下,如何自動實現增加Looper
    你可以用HandlerThread

    回覆
    0
  • 取消回覆