一、定義
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...