Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android架構分析之Android消息處理機制(三)

Android架構分析之Android消息處理機制(三)

編輯:關於Android編程

 

本文我們來分析AndroidUI線程即主線程是怎樣實現對消息的處理的。

UI線程的實現類定義在frameworks/base/core/java/android/app/ActivityThread.java文件中。我們來看Android對ActivityThread類的說明 :

130/**

131 * This manages the execution of the mainthread in an

132 * application process, scheduling andexecuting activities,

133 * broadcasts, and other operations on itas the activity

134 * manager requests.

135 *

136 * {@hide}

137 */

 

下面是ActivityThread類的main函數:

 

5024    public static void main(String[] args) {
5025        SamplingProfilerIntegration.start();
5026
5027        // CloseGuard defaults to true and canbe quite spammy.  We
5028        // disable it here, but selectivelyenable it later (via
5029        // StrictMode) on debug builds, butusing DropBox, not logs.
5030        CloseGuard.setEnabled(false);
5031
5032        Environment.initForCurrentUser();
5033
5034        // Set the reporter for event loggingin libcore
5035        EventLogger.setReporter(newEventLoggingReporter());
5036
5037        Security.addProvider(newAndroidKeyStoreProvider());
5038
5039       Process.setArgV0();
5040
5041        Looper.prepareMainLooper();
5042
5043        ActivityThread thread = newActivityThread();
5044        thread.attach(false);
5045
5046        if (sMainThreadHandler == null) {
5047            sMainThreadHandler =thread.getHandler();
5048        }
5049
5050        AsyncTask.init();
5051
5052        if (false) {
5053           Looper.myLooper().setMessageLogging(new
5054                    LogPrinter(Log.DEBUG,ActivityThread));
5055        }
5056        if(!user.equals(android.os.Build.TYPE)) {
5057            sLocalLog = new LocalLog(128);
5058           Looper.myLooper().setMessageLogging(sLocalLog);
5059        }
5060
5061        Looper.loop();
5062
5063        throw new RuntimeException(Mainthread loop unexpectedly exited);
5064    }


 

5041行,調用Looper.prepareMainLooper函數,這與上一篇文章中介紹的普通線程調用Looper.prepare()函數不同,我們來看Looper.prepareMainLooper函數的實現:

 

 88    /**
 89     *Initialize the current thread as a looper, marking it as an
 90     *application's main looper. The main looper for your application
 91     *is created by the Android environment, so you should never need
 92     *to call this function yourself.  Seealso: {@link #prepare()}
 93    */
 94   public static void prepareMainLooper() {
 95       prepare(false);
 96       synchronized (Looper.class) {
 97           if (sMainLooper != null) {
 98                throw newIllegalStateException(The main Looper has already been prepared.);
 99           }
100            sMainLooper = myLooper();
101        }
102    }


 

可以看到,95行,prepareMainLooper首先調用prepare(false),所以和普通線程類似,只不過傳遞的參數是false,表示該Looper不能退出,因為UI線程是不允許退出消息循環的。

100行,調用myLooper函數,取得當前Looper即UI線程Looper,保存在sMainLooper變量中,這樣做的目的是,如果其它線程想要獲得UI線程Looper,只需要調用getMainLooper函數即可。

5046-5048行,如果sMainThreadHandler為null,調用thread.getHandler(),該函數返回一個H類對象mH,H類ActivityThread類的內部類,繼承自Handler類,其中完成了對許多Message的默認處理。

5061行,調用Looper.loop()函數,進入消息循環處理。

對比上一篇文章《Android架構分析之Android消息處理機制(二)》,分析到這裡,我們就可以看到UI線程與普通線程執行消息處理的流程大致相同,區別僅是調用Looper.prepareMainLooper,而不是Looper.prepare,同時Handler使用的是H類對象mH。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved