Handler 使用方法記錄
Handler對象的創建方法
Handler對象的創建前提是當前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的操作
創建方法:
-
創建新消息,這種方法效率極低,不推薦使用
Message message = new Message();
-
從消息池中取出一個消息,如果消息為空會創建新的
Message message = Message.obtain();
-
通過handler對象取出消息,消息的目標為handler
Message message = handler.obtainMessage();
Message類型設置:
message.what = 2;
存入要傳遞的數據:
-
存入簡單數據:兩個int一個object
message.arg1 = 12; message.arg2 = 13; message.obj = 一個對象;
-
存入復雜數據
Bundle data = new Bundle(); message.setData(data);
發送消息:
-
發送有目標的Message對象
message.sendToTarget();
-
通過handler發送沒有目標的Message對象
handler.sendMessage(message)
Looper操作
子線程中要使用Looper必須自己創建,它通過一個局部線程變量
ThreadLocal
和線程以鍵值對的形式關聯。
創建方法:在Handler創建之前執行
Looper.prepare();
開啟死循環處理消息列隊中的Message
Looper.loop();
Handler主線程內部通信的例子
實現效果:讓Activity中的一個TextView實時更新時間
關鍵代碼
Activity中的屬性:
private TextView mTextView;
private Handler mHandler;
private SimpleDateFormat mDateFormat = new SimpleDateFormat("HH:mm:ss", Locale.CHINA);
onCreate()方法內代碼:
mTextView = (TextView) findViewById(R.id.main_time);
mHandler = new Handler(this);
mHandler.sendEmptyMessage(1);
Activity實現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; //??
}
最終效果:
時間會刷新
Handler從主線程傳送消息給子線程
- 在主線程中聲明
Handler
- 在子線程中賦值
Handler
實現Handler.Callback
接口重寫里面的方法 - 在主線程中創建
Message
并設置目標為該Handler
發送數據。 - 子線程中
Handler.Callback
接口內部的方法處理數據。
從子線程傳消息到主線程
- 在主線程中聲明
Handler
并賦值 - 讓
activity
實現Handler.Callback
重寫方法 - 在子線程成中獲取
Handler
對象并傳遞數據 - 主線程
activity
中Handler.Callback
里面的方法處理從子線程中傳過來的數據。