UI執行緒和非UI執行緒的互動方式

2021-08-02 11:01:00 字數 1499 閱讀 5886

一般應該把像讀寫檔案、請求網路這類的耗時操作放在子執行緒中去執行,這樣可以避免ui執行緒的響應事件過慢,但是很多情況下在子執行緒中需要更新介面,比如從網路中獲取到或者響應字串後,將結果顯示到介面上,但是在子執行緒中不允許直接更新ui介面,這時就需要在子執行緒中將結果返回給ui執行緒,由ui執行緒來負責更新介面元素,android提供了幾種方式用於處理ui執行緒和非ui執行緒之間的互動

1、handler

handler是最經常被用於子執行緒和主線程之間的互動方式,使用方式也很簡單,在主線程中新建handler,在子執行緒中通過handler將資料通過message傳送給主線程,主線程負責更新ui介面

主線程主要**

handler handler = new handler() 

};};

子執行緒主要**

message

message = message.obtain();

message.what = 0x123;

message.obj = "this is a string from thread";

handler.sendmessage(message);

上述**將乙個字串放入message中,通過handler傳送到主線程中,主線程中將字串取出顯示在textview上

2、activity.runonuithread(runnable runnable)

這個方法將更新ui的操作放入到runnable中,在需要更新介面時,將runnable傳入到runonuithread中,這樣runnable就會在ui執行緒中被呼叫,如果當前是ui執行緒,動作立即執行,如果不是ui執行緒,將操作發布到ui執行緒的事件佇列中等待呼叫。runnable並不是乙個新的執行緒,而是代表其中的**是執行在主線程中的

主要**

new thread() 

});};

}.start();

3、view.post(runnable runnable)

post方法中的runnable和runonuithread中的runnable是一樣的,都表示將操作post到主線程的事件佇列中,其中的**都是在主線程中執行的,可以直接使用view物件來呼叫

主要**

new thread() 

});}.start();

4、view.postdelay(runnable runnable, long delay)

這個方法和view.post()是一樣的,只是多了乙個延遲時間的引數,表示多長時間後將runnable加入主線程的事件佇列中

主要**

new thread() ;

}, 3000);

};}.start();

5、asynctask

如何實現非ui執行緒更新ui執行緒?

1.實現非ui執行緒更新ui執行緒的 2.編碼中出現的乙個錯誤及 之前的基本做法是使用invoke實現,這裡採用的是 net 4.0中的task來實現,如下 using system using system.collections.generic using system.componentmod...

SWT多執行緒 關於非UI執行緒操作UI執行緒(二)

隨後需要在乙個新開啟的視窗後啟動乙個執行緒讀取乙個物件並按秒重新整理介面顯示。仍然使用非同步執行緒實現。方法為 1 建立乙個執行緒 public class testthread extends thread public void run catch exception e display.asy...

非UI執行緒訪問控制項

在vs2003之後的版本中,net加強了執行緒安全方面,非ui執行緒是不能直接訪問控制項的。這要求我們對控制項進行執行緒安全方式的呼叫。當然,我們也可以這樣做 checkforillegalcrossthreadcalls false 這個屬性包含在 system.windows.forms 中 這...