Android編程中關于單線程模型的理解與分析
本文講述了Android編程中關于單線程模型的理解與分析。分享給大家供大家參考,具體如下:
當一個Android程序啟動時,Android系統(tǒng)會同時啟動一個對應的主線程(Main Thread)。
由于這個主線程(Main Thread)主要的任務就是對UI相關的事件進行處理(例如顯示文本,處理點擊事件,顯示圖片等),系統(tǒng)對每一個組件的調用都是從主線程中分發(fā)出去的,所以又常被稱為UI線程。
IMP,Android單線程模型的核心原則就是:只能在UI線程(Main Thread)中對UI進行處理。
為了提高Performance,Android對UI處理的相關method都不是synchronized,所以當你試圖用其他線程來對UI進行操作時,會拋出如下異常:
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
當然,這并非鼓勵我們將一切操作都放在UI線程當中進行。
有些十分費時但對UI更新影響很小的操作(如網(wǎng)絡操作,數(shù)據(jù)庫操作等),若一起放在UI線程當中去進行的話,會導致UI Performance十分poor,對的,非常非常poor,甚至彈出ANR(Application Not Responding)窗口,這無疑對用戶是十分不友好的。
Ps:據(jù)我所知,Android SDK在4.0版本之后就不支持在Main Thread中直接進行網(wǎng)絡相關操作,除非你厚顏無恥地在主線程中加上如下代碼:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath() .build());
因此,Android單線程模型的原則總結起來大致有兩點:
1.只能在UI線程(Main Thread)中對UI進行處理,不要在UI線程之外訪問Android UI toolkit
2.不要用費時的操作阻塞UI線程
關于如何處理好Android程序中的多線程,可以參考Android官方training
希望本文所述對大家Android程序設計有所幫助。
相關文章
學習使用Material Design控件(三)使用CardView實現(xiàn)卡片效果
這篇文章主要為大家介紹了學習使用Material Design控件的詳細教程,如何使用CardView實現(xiàn)卡片效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
Android Activity之間相互調用與傳遞參數(shù)的原理與用法分析
這篇文章主要介紹了Android Activity之間相互調用與傳遞參數(shù)的原理與用法,較為詳細的分析了Android組件的構成以及Activity的創(chuàng)建、調用、切換等相關操作技巧,需要的朋友可以參考下2016-08-08
Android UI設計與開發(fā)之實現(xiàn)應用程序只啟動一次引導界面
這篇文章主要為大家詳細介紹了Android UI設計與開發(fā)之實現(xiàn)應用程序只啟動一次引導界面,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08
淺析Android中getWidth()和getMeasuredWidth()的區(qū)別
這篇文章主要介紹了淺析Android中getWidth()和getMeasuredWidth()的區(qū)別 ,getMeasuredWidth()獲取的是view原始的大小,getWidth()獲取的是這個view最終顯示的大小,具體區(qū)別介紹大家參考下本文2018-04-04
Android實戰(zhàn)打飛機游戲之實現(xiàn)主角以及主角相關元素(3)
這篇文章主要為大家詳細介紹了Android實戰(zhàn)打飛機游戲之實現(xiàn)主角以及主角相關元素,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-07-07

