Handler 使用方法記錄

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的操作

創建方法

  1. 創建新消息,這種方法效率極低,不推薦使用

     Message message = new Message();
    
  2. 從消息池中取出一個消息,如果消息為空會創建新的

     Message message = Message.obtain();
    
  3. 通過handler對象取出消息,消息的目標為handler

     Message message = handler.obtainMessage();
    

Message類型設置

    message.what = 2; 

存入要傳遞的數據:

  1. 存入簡單數據:兩個int一個object

     message.arg1 = 12;
     message.arg2 = 13;
     message.obj = 一個對象;
    
  2. 存入復雜數據

     Bundle data = new Bundle();
     message.setData(data);
    

發送消息:

  1. 發送有目標的Message對象

     message.sendToTarget();
    
  2. 通過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從主線程傳送消息給子線程

  1. 在主線程中聲明Handler
  2. 在子線程中賦值Handler實現Handler.Callback接口重寫里面的方法
  3. 在主線程中創建Message并設置目標為該Handler發送數據。
  4. 子線程中Handler.Callback接口內部的方法處理數據。

從子線程傳消息到主線程

  1. 在主線程中聲明Handler并賦值
  2. activity實現Handler.Callback重寫方法
  3. 在子線程成中獲取Handler對象并傳遞數據
  4. 主線程activityHandler.Callback里面的方法處理從子線程中傳過來的數據。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容