美文网首页
Handler 使用方法记录

Handler 使用方法记录

作者: Passon_Fang | 来源:发表于2016-03-18 21:44 被阅读78次

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里面的方法处理从子线程中传过来的数据。

相关文章

网友评论

      本文标题:Handler 使用方法记录

      本文链接:https://www.haomeiwen.com/subject/cjkhlttx.html