Handler 使用方法記錄

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)建方法

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

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

     Message message = Message.obtain();
    
  3. 通過(guò)handler對(duì)象取出消息,消息的目標(biāo)為handler

     Message message = handler.obtainMessage();
    

Message類型設(shè)置

    message.what = 2; 

存入要傳遞的數(shù)據(jù):

  1. 存入簡(jiǎn)單數(shù)據(jù):兩個(gè)int一個(gè)object

     message.arg1 = 12;
     message.arg2 = 13;
     message.obj = 一個(gè)對(duì)象;
    
  2. 存入復(fù)雜數(shù)據(jù)

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

發(fā)送消息:

  1. 發(fā)送有目標(biāo)的Message對(duì)象

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

  1. 在主線程中聲明Handler
  2. 在子線程中賦值Handler實(shí)現(xiàn)Handler.Callback接口重寫里面的方法
  3. 在主線程中創(chuàng)建Message并設(shè)置目標(biāo)為該Handler發(fā)送數(shù)據(jù)。
  4. 子線程中Handler.Callback接口內(nèi)部的方法處理數(shù)據(jù)。

從子線程傳消息到主線程

  1. 在主線程中聲明Handler并賦值
  2. activity實(shí)現(xiàn)Handler.Callback重寫方法
  3. 在子線程成中獲取Handler對(duì)象并傳遞數(shù)據(jù)
  4. 主線程activityHandler.Callback里面的方法處理從子線程中傳過(guò)來(lái)的數(shù)據(jù)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容