安卓的handler機制

2021-08-20 20:20:24 字數 1831 閱讀 5400

一、定義

handler是訊息處理的機制,很多耗時的操作,如訪問網路、i/o操作等不能在主線程中執行,而這些操作又與ui的變化相關聯。常常採用由子執行緒完成操作,傳送訊息使切換到主線程更新ui的辦法。當然也可以用來獲取資料等。

與handle相關的類:message(訊息), messagequeue(訊息佇列), looper(訊息迴圈)。

message:訊息包含了子、主線程之間交換的資料,如what(型別)、obj(內容)等

messagequeue,訊息佇列對訊息的統一管理,新增訊息,處理訊息

looper:通過無限迴圈的方式,查詢messagequeue中是否有訊息待處理,如果有就進行處理。主線程中預設初始化了looper,所以在程式設計時只需要通過handle進行訊息的傳送接收。

二、工作流程

當handler傳送了訊息,messagequeue裡就新增一條訊息,然後messagequeue就會返回這條訊息給looper,looper接收到訊息之後最終交給交還給handler,呼叫handlemessage()方法處理。

三、例子

1、建立子執行緒

private runnable mrunnable = new runnable() 

};

2、執行子執行緒

//啟動執行緒

newthread(mrunnable).start();

3、handler進行訊息的處理

handler handler = new handler() 

}};

四、非同步asynctask機制

可以和handler一樣完成執行緒通訊,asynctask允許我們的執行乙個非同步的任務在後台。將耗時的操作放在非同步任務當中來執行,並隨時結果返回給我們的ui執行緒來更新我們的ui控制項。

步驟:

1、主線程例項化asynctask物件,並呼叫execute方法

new myasynctask().execute(引數);

2、實現asynctask子類

public

class

myasynctask

extends

asynctask

@override

protected

byte doinbackground(string... params)

@override

protected

void onprogressupdate(integer... values)

@override

protected

void onpostexecute(byte result)

}@override

public

boolean oncreateoptionsmenu(menu menu)

}

執行順序是:

onpreexecute() –>

doinbackground() –>

publishprogress() –>

onpostexecute()

五、對比

1、handler和asynctask實現功能相同,當子執行緒較多時,使用handler更簡單一點。

2、asynctask還提供了oncancelled()方法,在主線程中執行,當非同步任務取消時,oncancelled()會被呼叫,這個時候onpostexecute()則不會被呼叫。asynctask中的cancel()方法並不是真正去取消任務,只是設定這個任務為取消狀態,我們需要在doinbackground()判斷終止任務。

安卓 Handler引起的記憶體洩漏

myhandler activity activity override public void handlemessage message msg 將 改為以上形式之後,就算完成了。還有一種就是當activity銷毀的時候,也就是在ondestroy 方法裡加上 mhandler.removeca...

安卓的廣播機制學習

今天學習的是安卓中廣播機制,在周五聽完實驗室陽仔的相關報告之後,我動手做了一些小練習,並且在過程中遇到了一些問題。1.在實現button的監聽是,我匯入的onclicklistener的包有誤,並不是android.view.view.onclicklitener 2.靜態註冊接收器時,使用了內部類...

180725 安卓 簽名機制

傳送者將公鑰公開,對於傳送資料的資訊摘要用私鑰加密 接受者用公鑰解密該內容,與接收資料的資訊摘要進行對比 從而保證 1.接收到的資料與發布資料相同 2.傳送者是公開公鑰的私鑰持有人 與https相同,公鑰必須可信才有意義 因此簽名也需要攜帶乙個由可信ca機構簽發的證書,證明該公鑰來自可信的傳送者 s...