當前位置:首頁 » 安卓系統 » androidui線程

androidui線程

發布時間: 2022-07-03 20:46:33

1. Android系統為什麼不允許在線程中訪問UI

UI線程及Android的單線程模型原則當應用啟動,系統會創建一個主線程(main thread)。這個主線程負責向UI組件分發事件(包括繪制事件),也是在這個主線程里,應用和Android的UI組件(components from the Android UI toolkit (components from the android.widget and android.view packages))發生交互。

當App做一些比較重(intensive)的工作的時候,除非合理地實現,否則單線程模型的performance會很poor。特別的是,如果所有的工作都在UI線程,做一些比較耗時的工作比如訪問網路或者資料庫查詢,都會阻塞UI線程,導致事件停止分發(包括繪制事件)。對於用戶來說,應用看起來像是卡住了,更壞的情況是,如果UI線程blocked的時間太長(大約超過5秒),用戶就會看到ANR(application not responding)的對話框。

另外,Andoid UI toolkit並不是線程安全的,所以不能從非UI線程來操縱UI組件。必須把所有的UI操作放在UI線程里,所以Android的單線程模型有兩條原則:
1.不要阻塞UI線程。
2.不要在UI線程之外訪問Android UI toolkit(主要是這兩個包中的組件:android.widget and android.view)。

2. android 為什麼要設計ui線程

UI線程,即主線程。為何將UI線程和其他事物線程,是由於其他事務處理會需要更多的時間去載入,也就是所謂的耗時操作,這樣不會導致頁面載入需要很久(至少畫面出來了,數據可以略慢)。設計UI線程是為了使得程序能夠獨立完成界面載入不受其他線程影響速度。

3. Android中進程與線程及如何在子線程中操作U

一個Android 程序默認情況只有一個進程,但是一個進程可以有多個線程。其中有一個UI 線程也稱為UI主線程,UI Thread在Android程序運行的時候就被創建,主要是負責控制UI界面的顯示、更新和控制項交互。所有的Android應用程序組件----包括Activity、Service、Broadcast Receiver都在應用程序的主線程中運行。因此,任何組件中的費時操作處理都可能阻塞所有其他的組件、包括Service和可見的Activity。
在Android 中,對未響應的定義是:Activity對一個輸入事件在5s內沒有響應,或者Broadcast Receiver在10s內沒有完成他的onReceive處理程序。對於任何不用直接和用戶界面進行交互的重要處理,使用後台線程技術處理是非常重要的,將文件操作、網路交互、資料庫、復雜計算調度到後台線程中完成非常重要,以免阻塞主線程。
方法一:Thread+Handler
開啟一個新線程:new Thread(new MyThread()).start();

//通過Handler物件,通知主線程UI Thread來更新界面
Handler myHandler=new Handler(){
//此方法主要用於更新UI
public void handleMessage(Message msg){
switch(msg.what){
//根據Thread返回的標識進行相應的處理
}
}
};

class MyThread implements Runnable{
public void run(){
int what=0;
//將耗時操作放到這里處理

//to-do

4. Android 在子線程中更新UI的幾種方法示例

請您慢慢看:

直接在UI線程中開啟子線程來更新TextView顯示的內容,運行程序我們會發現,如下錯誤:android.view.ViewRoot$: Only the original thread that created a view hierarchy can touch its views.翻譯過來就是:只有創建這個控制項的線程才能去更新該控制項的內容。

所有的UI線程要去負責View的創建並且維護它,例如更新冒個TextView的顯示,都必須在主線程中去做,我們不能直接在UI線程中去創建子線程,要利用消息機制:handler,如下就是handler的簡單工作原理圖:

既然android給我們提供了Handler機制來解決這樣的問題,請看如下代碼:

public class HandlerTestActivity extends Activity { private TextView tv; private static final int UPDATE = 0; private Handler handler = new Handler() { @Overridepublic void handleMessage(Message msg) { // TODO 接收消息並且去更新UI線程上的控制項內容if (msg.what == UPDATE) { // Bundle b = msg.getData();// tv.setText(b.getString("num")); tv.setText(String.valueOf(msg.obj)); } super.handleMessage(msg); } }; /** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView) findViewById(R.id.tv); new Thread() { @Overridepublic void run() { // TODO 子線程中通過handler發送消息給handler接收,由handler去更新TextView的值try { for (int i = 0; i < 100; i++) { Thread.sleep(500); Message msg = new Message(); msg.what = UPDATE; // Bundle b = new Bundle();// b.putString("num", "更新後的值:" + i);// msg.setData(b); msg.obj = "更新後的值:" + i; handler.sendMessage(msg); } } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); }}

我們就通過Handler機制來處理了子線程去更新UI線程式控制制項問題,Andrid開發中要經常用到這種機制。

5. android 哪些操作需要在ui 線程中

anroid系統中UI線程負責向UI組件分發事件(包括繪制事件),並處理用戶和應用之間交互。
做一些比較耗時的工作比如訪問網路或者資料庫查詢,都會阻塞UI線程,導致事件停止分發(包括繪制事件)。對於用戶來說,應用看起來像是卡住了,更壞的情況是,如果UI線程blocked的時間太長(大約超過5秒),用戶就會看到ANR(application not responding)的對話框。
因此在ui線程做耗時非常短,不會發生阻塞的操作

熱點內容
編譯環境出現問題怎麼搞 發布:2022-08-11 13:47:01 瀏覽:769
hr系統源碼 發布:2022-08-11 13:46:59 瀏覽:941
android手機標識 發布:2022-08-11 13:46:50 瀏覽:901
存儲設備硬碟 發布:2022-08-11 13:45:27 瀏覽:615
加密狗培訓 發布:2022-08-11 13:45:19 瀏覽:300
sqlserver數據挖掘 發布:2022-08-11 13:43:43 瀏覽:35
微擎小說源碼 發布:2022-08-11 13:39:51 瀏覽:10
linux安卓模擬 發布:2022-08-11 13:38:04 瀏覽:687
shell腳本目錄 發布:2022-08-11 13:36:46 瀏覽:463
雙是寵妃ftp 發布:2022-08-11 13:35:38 瀏覽:577