編輯:關於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。
下面是效果圖 目錄工程如下: 具體實現以及寫的過程中遇到的問題第一步:建立數據庫,像這種比較繁多的數據,可以用execl表格來做,然後Na
本實例通過TimePickerDialog時間選擇對話框讓用戶設置鬧鐘,並通過AlarmManager全局定時器在指定的時間啟動鬧鐘Activity 。 程序運行效果圖
最新更新的Flyme6整體效果不錯,動畫效果增加了很多了,看了看flyme6的Viewpager指示器,覺得有點意思,就模仿寫了一下,整體效果如下: GradleJitP
本文是在完成了Android百度地圖應用開發基礎知識的基礎上繼續實現的。本文實例為大家分享了Android如何顯示地圖,並為後續內容做准備,供大家參考,具體內容如下&nb