Android非同步訊息處理Handler的使用

2021-07-03 10:30:23 字數 1494 閱讀 5930

眾所周知,android的ui執行緒是不安全的,其它執行緒不可以直接操作ui。那麼就產生了乙個問題~android非同步訊息處理---如何在其它執行緒進行ui更新操作。

由於ui都是由主線程繪製的,在進行耗時操作的時候會導致主線程繁忙,最後導致ui介面卡頓或無反應,所以在進行耗時操作的時候我們應該新建一條執行緒去計算耗時操作,計算完畢再利用android提供的handler進行更新ui。(訪問網路也是屬於耗時操作)

adnroid 進行非同步訊息處理是使用handler去操作的,接下來我們看一下如何通過handler進行更新ui。

首先我們新建一條執行緒來模擬計算耗時計算:

public class mythread implements runnable  catch (interruptedexception e) 

message msg=new message();

bundle bundle=new bundle();//新建乙個bundle物件,bundle用來儲存資料

bundle.putstring("jieguo", s);//往bundle新增資料,bundle支援各種基礎型別資料報括int,double,char,float等等。

msg.setdata(bundle);//再把bundle新增到msg上

mainactivity.handler.sendmessage(msg);//通過handler物件呼叫sendmessage(msg)把msg傳送到目的地

// mainactivity.handler.sendmessagedelayed(msg,1000); 除了即時傳送還可以進行延遲傳送這行**的意思就是 延遲一秒傳送

}}

然後我們在主線程也就是activity裡面呼叫,並使用handler接收資料

public class mainactivity extends activity

//為了方便在handlermessage裡操作,在activity裡直接定義乙個內部類

static class myhandler extends handler

//在handlemessage裡進行更新ui的操作

@override

public void handlemessage(message msg)

}}

圖我就不上了,無非就是乙個textview從顯示helloworld變成顯示」呵呵「。

簡單來說使用handler更新資料就是在主線程new乙個handler類,然後在其它執行緒獲取這個handler 的物件,使用handler的物件呼叫sendmessage()。

然後在主線程裡面的handlermessage接收資料。在handlermessage根據所接受的資料進行更新ui操作。

最後說說在個別情況下在子執行緒新建handler:

在子執行緒新建handler的操作略有不同,在進行使用handler之前必須呼叫looper.prepare();才可以

最後留下乙個demo

android非同步訊息處理機制

我們都知道android的ui更新操作都是在主線程執行的,但是很多時候我們都需要在子執行緒 中執行一些費時的操作,以獲取我們所需要的變更資料。很多剛入門的同學都容易犯的乙個錯誤就是在子執行緒試圖去更新ui控制項,這樣做是被android禁止的,所以會出現崩潰的現象。android的非同步資訊處理機制...

Android非同步訊息處理機制

android 中的非同步訊息處理主要由四個部分組成,message handler messagequeue 和looper。1.message message message 的 what 字段,還可以使用 arg1 和 arg2 欄位來攜帶一些整型資料,使用 obj 字段攜帶乙個 object...

Android 解析非同步訊息處理機制

android中的非同步訊息處理主要由四部分組成,message handler messagequeue looper.1.message message是執行緒之間傳遞的訊息,它可以在內部攜帶少量的資訊,用於在不同執行緒之間交換資料。message有what欄位,除此以外,還可以使用arg1和a...