日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

有关android UI 线程

發布時間:2024/4/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 有关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 线程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。