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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android,UI主线程与子线程

發(fā)布時間:2025/3/20 Android 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android,UI主线程与子线程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?在一個Android 程序開始運行的時候,會單獨啟動一個Process。默認的情況下,所有這個程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的兩種,除此之外還有Content Provider和Broadcast Receiver)都會跑在這個Process。

??????? 一個Android 程序默認情況下也只有一個Process,但一個Process下卻可以有許多個Thread。
???
?????? 在這么多Thread當中,有一個Thread,我們稱之為UI Thread。UI Thread在Android程序運行的時候就被創(chuàng)建,是一個Process當中的主線程Main Thread,主要是負責(zé)控制UI界面的顯示、更新和控件交互。在Android程序創(chuàng)建之初,一個Process呈現(xiàn)的是單線程模型,所有的任務(wù)都在一 個線程中運行。因此,我們認為,UI Thread所執(zhí)行的每一個函數(shù),所花費的時間都應(yīng)該是越短越好。而其他比較費時的工作(訪問網(wǎng)絡(luò),下載數(shù)據(jù),查詢數(shù)據(jù)庫等),都應(yīng)該交由子線程去執(zhí)行, 以免阻塞主線程。


??????? 那么,UI Thread如何和其他Thread一起工作呢?常用方法是:

??????? 誕生一個主線程的Handler物件,當做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;
???????????? }
????????? }
????? }


?????? 當子線程的狀態(tài)發(fā)生變化,則在子線程中發(fā)出Message,通知更新UI。

?????? mHandler.sendEmptyMessageDelayed(UPDATE_UI, 0);

????
????? 在我們的程序中,很多Callback方法有時候并不是運行在主線程當中的,所以如果在Callback方法中更新UI失敗,也可以采用上面的方法。

總結(jié)

以上是生活随笔為你收集整理的Android,UI主线程与子线程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。