有关android UI 线程
1. GUI線程框架
常見的 Swing, SWT框架都是作為單線程子系統來實現的,實際上不僅限于在Java中, Qt、MacOS Cocoa以及其他的環境中的GUI框架都是單線程的。雖然很多人嘗試過其他的方案但最終回到了單線程的事件模型,簡單來看最主要的原因還在于多線程的GUI中更容易出現死鎖的問題[1]。
從android應用層來看,UI線程可以對應到系統中的ActivityThread,其中的main方法,建立主線程關聯的?Looper?以及MessageQueue。不難看出它是應用層的入口點。
1 public static void main(String[] args) { 2 SamplingProfilerIntegration.start(); 3 4 // CloseGuard defaults to true and can be quite spammy. We 5 // disable it here, but selectively enable it later (via 6 // StrictMode) on debug builds, but using DropBox, not logs. 7 CloseGuard.setEnabled(false); 8 9 Process.setArgV0("<pre-initialized>"); 10 11 Looper.prepareMainLooper(); 12 if (sMainThreadHandler == null) { 13 sMainThreadHandler = new Handler(); 14 } 15 16 ActivityThread thread = new ActivityThread(); 17 thread.attach(false); 18 19 if (false) { 20 Looper.myLooper().setMessageLogging(new 21 LogPrinter(Log.DEBUG, "ActivityThread")); 22 } 23 24 Looper.loop(); 25 26 throw new RuntimeException("Main thread loop unexpectedly exited"); 27 }?
2. ANR
惡名遠播的“Application Not Responding” 彈出框。由1中所述,單線程模型下的主線程如果做了其它大量復雜耗時的工作,無疑會對應用的性能造成極大影響。看到ANR實際上是系統發出警告了。在Activity生命周期方法里面的代碼處理,BroadcastReceiver#onReceive() 的執行,同一進程級內的直接運行在主線程中的Service?在執行復雜后臺任務時, 以及對IO的操作諸如數據庫訪問、文件讀寫等都需要考慮耗時的情況,必要時采用異步執行。
除了手動構建新的Thread方式外,系統也提供了眾多方便的工具,如?AsyncTask、HandlerThread、LoaderManager?等等。我們完全可以將主線程上的重負分離出來,構建更具有良好交互響應的應用。
?
3. 多線程條件下的影響
注意到多線程執行的環境下,自定義實現的Thread需要防止與主線程產生競爭的問題。系統底層線程(Linux 的POSIX threads,又稱 Pthreads)在被調度執行時與線程自身的優先級有關了。而一般自定義實現的Thread優先級別與主線程相同,考慮到對CPU時間片的占用,我們可以降低這類工作線程的優先級:
"Standard priority background threads. This gives your thread a slightly lower than normal priority, so that it will have less chance of impacting the responsiveness of the user interface." Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);?
對比可以看到?android.os.AsyncTask 中新增異步任務時的實現部分 :
mWorker = new WorkerRunnable<Params, Result>() {public Result call() throws Exception {mTaskInvoked.set(true);Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);return postResult(doInBackground(mParams));}};如果后臺有工作線程頻繁的執行操作時,在單核CPU的設備上對比可以發現,優先級的設置對主線程有比較明顯的響應。
?
引用:
[1] 《Java并發編程實踐》 P156
轉載于:https://www.cnblogs.com/raywalker/p/3172710.html
總結
以上是生活随笔為你收集整理的有关android UI 线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VMware vSphere 服务器虚拟
- 下一篇: 126邮箱注册