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);