android中UI主線程與子線程深入分析
本文較為深入的分析了android中UI主線程與子線程。分享給大家供大家參考。具體如下:
在一個Android 程序開始運行的時候,會單獨啟動一個Process。默認(rèn)的情況下,所有這個程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的兩種,除此之外還有Content Provider和Broadcast Receiver)都會跑在這個Process。
一個Android 程序默認(rèn)情況下也只有一個Process,但一個Process下卻可以有許多個Thread。在這么多Thread當(dāng)中,有一個Thread,我們稱之為UI Thread。UI Thread在Android程序運行的時候就被創(chuàng)建,是一個Process當(dāng)中的主線程Main Thread,主要是負(fù)責(zé)控制UI界面的顯示、更新和控件交互。在Android程序創(chuàng)建之初,一個Process呈現(xiàn)的是單線程模型,所有的任務(wù)都在一個線程中運行。因此,我們認(rèn)為,UI Thread所執(zhí)行的每一個函數(shù),所花費的時間都應(yīng)該是越短越好。而其他比較費時的工作(訪問網(wǎng)絡(luò),下載數(shù)據(jù),查詢數(shù)據(jù)庫等),都應(yīng)該交由子線程去執(zhí)行,以免阻塞主線程。
那么,UI Thread如何和其他Thread一起工作呢?常用方法是:誕生一個主線程的Handler物件,當(dāng)做Listener去讓子線程能將訊息Push到主線程的Message Quene里,以便觸發(fā)主線程的handlerMessage()函數(shù),讓主線程知道子線程的狀態(tài),并在主線程更新UI。
例如,在子線程的狀態(tài)發(fā)生變化時,我們需要更新UI。如果在子線程中直接更新UI,通常會拋出下面的異常:
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.
意思是,無法在子線程中更新UI。為此,我們需要通過Handler物件,通知主線程Ui Thread來更新界面。
如下,首先創(chuàng)建一個Handler,來監(jiān)聽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方法有時候并不是運行在主線程當(dāng)中的,所以如果在Callback方法中更新UI失敗,也可以采用上面的方法。
希望本文所述對大家的Android程序設(shè)計有所幫助。
相關(guān)文章
android studio 一直卡在Gradle:Build Running的幾種解決辦法
這篇文章主要介紹了android studio 一直卡在Gradle:Build Running的解決辦法,非常具有實用價值,需要的朋友可以參考下2017-10-10Android實現(xiàn)字母導(dǎo)航控件的示例代碼
這篇文章主要介紹了通過自定義View實現(xiàn)字母導(dǎo)航控件的示例代碼,文中的實現(xiàn)過程講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,感興趣的可以學(xué)習(xí)一下2022-01-01Android通過Socket與服務(wù)器之間進(jìn)行通信的示例
這篇文章主要介紹了Android通過Socket與服務(wù)器之間進(jìn)行通信的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12在不同Activity之間傳遞數(shù)據(jù)的四種常用方法
這篇文章主要介紹了在不同Activity之間傳遞數(shù)據(jù)的四種常用方法 的相關(guān)資料,需要的朋友可以參考下2016-03-03android表格效果之ListView隔行變色實現(xiàn)代碼
首先繼承SimpleAdapter再使用重載的Adapter來達(dá)到效果,其實主要是需要重載SimpleAdapter,感興趣的朋友可以研究下,希望本文可以幫助到你2013-02-02