原理:
Handler 、 Looper 、Message 這三個是Android異步消息處理線程相關(guān)的概念。異步消息處理線程啟動后會進(jìn)入一個無限的循環(huán)體之中,每次循環(huán),從其內(nèi)部的消息隊列中取出一個消息,然后回調(diào)相應(yīng)的消息處理函數(shù),執(zhí)行完成一個消息后則繼續(xù)循環(huán)。若消息隊列為空,線程則會阻塞等待。
Looper創(chuàng)建一個MessageQueue,然后進(jìn)入一個無限循環(huán)體不斷從該MessageQueue中讀取消息,而消息的創(chuàng)建者就是一個或多個Handler 。
使用:
private Handler mHandler = newHandler()
{
? ? ? ? ? public void handleMessage(android.os.Message?msg)
? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? switch(msg.what)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ?case value:
? ? ? ? ? ? ? ? ? ? ?break;
? ? ? ? ? ? ? ? ? ? ?default:
? ? ? ? ? ? ? ? ? ? ?break;
? ? ? ? ? ? ? ? }
? ? ? ? ? };
};
mHandler.sendMessage();
2,
private Handler mHandler =new Handler();
mHandler.post(newRunnable()
{
? ?@Override
? ?public void run()
? ?{
? ? ? Log.e("TAG",?Thread.currentThread().getName());
? ? ? ?mtv.setText("test");
? ?}
});
注意:
1, 避免內(nèi)存泄漏
a) 內(nèi)部類隱式包含外部類的引用
解決方法:
1,改為靜態(tài)內(nèi)部類。
2,或者手動管理線程及時結(jié)束以釋放對象
b) 結(jié)果執(zhí)行體中包含有View類,View會持有外部Context。
解決方法:
使用弱連接
2, Handler事實上提供了一個異步線程處理但方案,可以放在其他地方使用
參考:
https://my.oschina.net/rengwuxian/blog/181449
http://blog.csdn.net/feelang/article/details/39059705