Handler 使用方法記錄
Handler對(duì)象的創(chuàng)建方法
Handler對(duì)象的創(chuàng)建前提是當(dāng)前Thread中有Looper
1
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
2
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
return true;
}
});
Message的操作
創(chuàng)建方法:
-
創(chuàng)建新消息,這種方法效率極低,不推薦使用
Message message = new Message(); -
從消息池中取出一個(gè)消息,如果消息為空會(huì)創(chuàng)建新的
Message message = Message.obtain(); -
通過(guò)handler對(duì)象取出消息,消息的目標(biāo)為handler
Message message = handler.obtainMessage();
Message類型設(shè)置:
message.what = 2;
存入要傳遞的數(shù)據(jù):
-
存入簡(jiǎn)單數(shù)據(jù):兩個(gè)int一個(gè)object
message.arg1 = 12; message.arg2 = 13; message.obj = 一個(gè)對(duì)象; -
存入復(fù)雜數(shù)據(jù)
Bundle data = new Bundle(); message.setData(data);
發(fā)送消息:
-
發(fā)送有目標(biāo)的Message對(duì)象
message.sendToTarget(); -
通過(guò)handler發(fā)送沒(méi)有目標(biāo)的Message對(duì)象
handler.sendMessage(message)
Looper操作
子線程中要使用Looper必須自己創(chuàng)建,它通過(guò)一個(gè)局部線程變量
ThreadLocal和線程以鍵值對(duì)的形式關(guān)聯(lián)。
創(chuàng)建方法:在Handler創(chuàng)建之前執(zhí)行
Looper.prepare();
開(kāi)啟死循環(huán)處理消息列隊(duì)中的Message
Looper.loop();
Handler主線程內(nèi)部通信的例子
實(shí)現(xiàn)效果:讓Activity中的一個(gè)TextView實(shí)時(shí)更新時(shí)間
關(guān)鍵代碼
Activity中的屬性:
private TextView mTextView;
private Handler mHandler;
private SimpleDateFormat mDateFormat = new SimpleDateFormat("HH:mm:ss", Locale.CHINA);
onCreate()方法內(nèi)代碼:
mTextView = (TextView) findViewById(R.id.main_time);
mHandler = new Handler(this);
mHandler.sendEmptyMessage(1);
Activity實(shí)現(xiàn)Handler.Callback接口
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case 1:
mTextView.setText(mDateFormat.format(new Date()));
int item = mPager.getCurrentItem();
if (item == mList.size() - 1) {
mPager.setCurrentItem(0, false);
} else {
mPager.setCurrentItem(item + 1);
}
mHandler.sendEmptyMessageDelayed(1, 500);
break;
}
return true; //??
}
最終效果:

時(shí)間會(huì)刷新
Handler從主線程傳送消息給子線程
- 在主線程中聲明
Handler - 在子線程中賦值
Handler實(shí)現(xiàn)Handler.Callback接口重寫里面的方法 - 在主線程中創(chuàng)建
Message并設(shè)置目標(biāo)為該Handler發(fā)送數(shù)據(jù)。 - 子線程中
Handler.Callback接口內(nèi)部的方法處理數(shù)據(jù)。
從子線程傳消息到主線程
- 在主線程中聲明
Handler并賦值 - 讓
activity實(shí)現(xiàn)Handler.Callback重寫方法 - 在子線程成中獲取
Handler對(duì)象并傳遞數(shù)據(jù) - 主線程
activity中Handler.Callback里面的方法處理從子線程中傳過(guò)來(lái)的數(shù)據(jù)。