MatrixRhythm

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Handler:直译“操作者”

百度百科解释:

  Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。

转载:https://blog.csdn.net/qq_37321098/article/details/81535449#1.handler%E4%BD%9C%E7%94%A8%3A%C2%A0

1.handler作用: 

  1)传递消息Message

//两种创建消息方法:
//1.通过handler实例获取
Handler handler = new Handler();
Message message=handler.obtainMessage();
 
//2.通过Message获取
Message message=Message.obtain();
 
 
//源码中第一种获取方式其实也是内部调用了第二种:
public final Message obtainMessage(){
    return Message.obtain(this);
}

  注:不建议直接new Message,Message内部保存了一个缓存的消息池,我们可以用obtain从缓存池获得一个消息,Message使用完后系统会调用Recycle回收;如果自己new很多Message,每次使用完后系统放入缓存池,会占用很多内存。 

  传递接收消息:

//传递的数据
Bundle bundle = new Bundle();
bundle.putString("msg", "传递我这个消息");
//发送数据
Message message = Message.obtain();
message.setData(bundle);   //message.obj=bundle  传值也行
message.what = 0x11;
handler.sendMessage(message);
 
//////////////////////////////////////////////////////////////
 
//数据的接收
final Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 0x11) {
                Bundle bundle = msg.getData();
                String date = bundle.getString("msg");
            }
        }
};

   2)子线程通知主线程更新ui(待)

  //创建handler
        final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == 0x11) {
                    //更新ui
                          ......
                }
            }
        };
 
        new Thread(new Runnable() {
            @Override
            public void run() {
                //FIXME 这里直接更新ui是不行的
                //还有其他更新ui方式,runOnUiThread()等          
                message.what = 0x11;     
                handler.sendMessage(message);  
            }
        }).start();

2.常用api:

    //消息
    Message message = Message.obtain();
    //发送消息
    new Handler().sendMessage(message);
    //延时1s发送消息
    new Handler().sendMessageDelayed(message, 1000);
    //发送带标记的消息(内部创建了message,并设置msg.what = 0x1)
    new Handler().sendEmptyMessage(0x1);
    //延时1s发送带标记的消息
    new Handler().sendEmptyMessageDelayed(0x1, 1000);
    //延时1秒发送消息(第二个参数为:相对系统开机时间的绝对时间,而SystemClock.uptimeMillis()是当前开机时间)
    new Handler().sendMessageAtTime(message, SystemClock.uptimeMillis() + 1000);
 
    //避免内存泄露的方法:
    //移除标记为0x1的消息
    new Handler().removeMessages(0x1);
    //移除回调的消息
    new Handler().removeCallbacks(Runnable);
    //移除回调和所有message
    new Handler().removeCallbacksAndMessages(null);

 

posted on 2019-10-25 10:55  Matrix锅锅  阅读(277)  评论(0编辑  收藏  举报