android中UI主線程與子線程深入分析
本文較為深入的分析了android中UI主線程與子線程。分享給大家供大家參考。具體如下:
在一個(gè)Android 程序開(kāi)始運(yùn)行的時(shí)候,會(huì)單獨(dú)啟動(dòng)一個(gè)Process。默認(rèn)的情況下,所有這個(gè)程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的兩種,除此之外還有Content Provider和Broadcast Receiver)都會(huì)跑在這個(gè)Process。
一個(gè)Android 程序默認(rèn)情況下也只有一個(gè)Process,但一個(gè)Process下卻可以有許多個(gè)Thread。在這么多Thread當(dāng)中,有一個(gè)Thread,我們稱(chēng)之為UI Thread。UI Thread在Android程序運(yùn)行的時(shí)候就被創(chuàng)建,是一個(gè)Process當(dāng)中的主線程Main Thread,主要是負(fù)責(zé)控制UI界面的顯示、更新和控件交互。在Android程序創(chuàng)建之初,一個(gè)Process呈現(xiàn)的是單線程模型,所有的任務(wù)都在一個(gè)線程中運(yùn)行。因此,我們認(rèn)為,UI Thread所執(zhí)行的每一個(gè)函數(shù),所花費(fèi)的時(shí)間都應(yīng)該是越短越好。而其他比較費(fèi)時(shí)的工作(訪問(wèn)網(wǎng)絡(luò),下載數(shù)據(jù),查詢(xún)數(shù)據(jù)庫(kù)等),都應(yīng)該交由子線程去執(zhí)行,以免阻塞主線程。
那么,UI Thread如何和其他Thread一起工作呢?常用方法是:誕生一個(gè)主線程的Handler物件,當(dāng)做Listener去讓子線程能將訊息Push到主線程的Message Quene里,以便觸發(fā)主線程的handlerMessage()函數(shù),讓主線程知道子線程的狀態(tài),并在主線程更新UI。
例如,在子線程的狀態(tài)發(fā)生變化時(shí),我們需要更新UI。如果在子線程中直接更新UI,通常會(huì)拋出下面的異常:
11-07 13:33:04.393: ERROR/JavaBinder(1029):android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.
意思是,無(wú)法在子線程中更新UI。為此,我們需要通過(guò)Handler物件,通知主線程Ui Thread來(lái)更新界面。
如下,首先創(chuàng)建一個(gè)Handler,來(lái)監(jiān)聽(tīng)Message的事件:
private final int UPDATE_UI = 1;
private Handler mHandler = new MainHandler();
private class MainHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_UI: {
Log.i("TTSDeamon", "UPDATE_UI");
showTextView.setText(editText.getText().toString());
ShowAnimation();
break;
}
default:
break;
}
}
}
或者:
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_UI: {
Log.i("TTSDeamon", "UPDATE_UI");
showTextView.setText(editText.getText().toString());
ShowAnimation();
break;
}
default:
break;
}
}
}
當(dāng)子線程的狀態(tài)發(fā)生變化,則在子線程中發(fā)出Message,通知更新UI。
mHandler.sendEmptyMessageDelayed(UPDATE_UI, 0);
在我們的程序中,很多Callback方法有時(shí)候并不是運(yùn)行在主線程當(dāng)中的,所以如果在Callback方法中更新UI失敗,也可以采用上面的方法。
希望本文所述對(duì)大家的Android程序設(shè)計(jì)有所幫助。
相關(guān)文章
詳解Android性能優(yōu)化之啟動(dòng)優(yōu)化
一款應(yīng)用的第一印象很重要,第一印象往往決定了用戶(hù)的去留。打開(kāi)一款應(yīng)用,如果速度很快,很順暢,那么很容易讓人覺(jué)得這款應(yīng)用背后的技術(shù)實(shí)力很強(qiáng),用戶(hù)潛意識(shí)中會(huì)對(duì)這款應(yīng)用更加的信賴(lài)。本文將詳細(xì)介紹Android性能優(yōu)化之啟動(dòng)優(yōu)化。2021-06-06
Android 畫(huà)中畫(huà)模式的實(shí)現(xiàn)示例
這篇文章主要介紹了Android 畫(huà)中畫(huà)模式的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Android 安全退出應(yīng)用程序的方法總結(jié)
這篇文章主要介紹了Android 安全退出應(yīng)用程序的方法總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-03-03
Android 活動(dòng)條ActionBar的詳解及實(shí)例代碼
這篇文章主要介紹了Android 活動(dòng)條ActionBar的詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-12-12
Android實(shí)現(xiàn)調(diào)用系統(tǒng)相冊(cè)和拍照的Demo示例
這篇文章主要介紹了Android實(shí)現(xiàn)調(diào)用系統(tǒng)相冊(cè)和拍照的Demo示例,實(shí)例分析了Android調(diào)用系統(tǒng)相冊(cè)及拍照的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Android實(shí)現(xiàn)帶列表的地圖POI周邊搜索功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)帶列表的地圖POI周邊搜索功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05
Android中實(shí)現(xiàn)詞組高亮TextView方法示例
高亮顯示大家應(yīng)該都不陌生,在開(kāi)發(fā)中經(jīng)常會(huì)遇到這個(gè)需求,所以下面這篇文章主要給大家介紹了關(guān)于Android中實(shí)現(xiàn)詞組高亮TextView的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-10-10
Android關(guān)鍵字persistent詳細(xì)分析
這篇文章主要介紹了Android關(guān)鍵字persistent的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-04-04

