美文网首页
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