Android編程中關(guān)于單線程模型的理解與分析
本文講述了Android編程中關(guān)于單線程模型的理解與分析。分享給大家供大家參考,具體如下:
當(dāng)一個(gè)Android程序啟動(dòng)時(shí),Android系統(tǒng)會(huì)同時(shí)啟動(dòng)一個(gè)對(duì)應(yīng)的主線程(Main Thread)。
由于這個(gè)主線程(Main Thread)主要的任務(wù)就是對(duì)UI相關(guān)的事件進(jìn)行處理(例如顯示文本,處理點(diǎn)擊事件,顯示圖片等),系統(tǒng)對(duì)每一個(gè)組件的調(diào)用都是從主線程中分發(fā)出去的,所以又常被稱(chēng)為UI線程。
IMP,Android單線程模型的核心原則就是:只能在UI線程(Main Thread)中對(duì)UI進(jìn)行處理。
為了提高Performance,Android對(duì)UI處理的相關(guān)method都不是synchronized,所以當(dāng)你試圖用其他線程來(lái)對(duì)UI進(jìn)行操作時(shí),會(huì)拋出如下異常:
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
當(dāng)然,這并非鼓勵(lì)我們將一切操作都放在UI線程當(dāng)中進(jìn)行。
有些十分費(fèi)時(shí)但對(duì)UI更新影響很小的操作(如網(wǎng)絡(luò)操作,數(shù)據(jù)庫(kù)操作等),若一起放在UI線程當(dāng)中去進(jìn)行的話,會(huì)導(dǎo)致UI Performance十分poor,對(duì)的,非常非常poor,甚至彈出ANR(Application Not Responding)窗口,這無(wú)疑對(duì)用戶是十分不友好的。
Ps:據(jù)我所知,Android SDK在4.0版本之后就不支持在Main Thread中直接進(jìn)行網(wǎng)絡(luò)相關(guān)操作,除非你厚顏無(wú)恥地在主線程中加上如下代碼:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath() .build());
因此,Android單線程模型的原則總結(jié)起來(lái)大致有兩點(diǎn):
1.只能在UI線程(Main Thread)中對(duì)UI進(jìn)行處理,不要在UI線程之外訪問(wèn)Android UI toolkit
2.不要用費(fèi)時(shí)的操作阻塞UI線程
關(guān)于如何處理好Android程序中的多線程,可以參考Android官方training
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
相關(guān)文章
Android布局之GridLayout網(wǎng)格布局
網(wǎng)格布局標(biāo)簽是GridLayout。這個(gè)布局是android4.0新增的布局。這個(gè)布局只有4.0之后的版本才能使用。本文給大家介紹Android布局之GridLayout網(wǎng)格布局相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧2015-12-12Android Content Provider詳解及示例代碼
本文主要講解Android Content Provider,這里提供相關(guān)文檔資料,并附有實(shí)現(xiàn)代碼和實(shí)現(xiàn)效果圖,有需要的小伙伴可以參考下2016-08-08Popupwindow 的簡(jiǎn)單實(shí)用案例(顯示在控件下方)
下面小編就為大家?guī)?lái)一篇Popupwindow 的簡(jiǎn)單實(shí)用案例(顯示在控件下方)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04Android 開(kāi)發(fā)系統(tǒng)自帶語(yǔ)音模塊應(yīng)用
本篇文章 主要介紹 Android 開(kāi)發(fā)自帶語(yǔ)音模塊實(shí)例,在開(kāi)發(fā)Android系統(tǒng)中會(huì)用到系統(tǒng)語(yǔ)音搜索模塊,這里給大家一個(gè)參考實(shí)例2016-07-07Android實(shí)現(xiàn)一周時(shí)間早中晚排班表
項(xiàng)目需求需要實(shí)現(xiàn)一個(gè)動(dòng)態(tài)添加,修改一周早中晚時(shí)間排班表,文章給大家提供了實(shí)現(xiàn)代碼,需要的朋友參考下吧2018-07-07Android自定義控件實(shí)現(xiàn)驗(yàn)證碼倒計(jì)時(shí)
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)驗(yàn)證碼倒計(jì)時(shí)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Android使用ViewPager實(shí)現(xiàn)圖片滑動(dòng)預(yù)覽效果
這篇文章主要為大家詳細(xì)介紹了Android使用ViewPager實(shí)現(xiàn)圖片滑動(dòng)預(yù)覽效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07