Handler
机制
- android提供了handler和looper来满足线程间的通信。每一个handler都必须关联一个looper
- handler负责处理绑定到该线程中的message,looper负责从其内部的messageQueue(消息队列)中拿出一个个的message给handler进行处理。因为handler是在UI线程中实现的。所以经过handler和message机制就可以回到UI线程中了
角色
- handler:处理后台进程返回数据的工作人员,你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从MessageQueue取出所送来的消息
- message:后台进程返回的数据,里面可以存储bundle等数据格式
- messageQueue:是线程对应looper的一部分,负责存储从后台线程中抛回的和当前handler绑定的message,是一个队列
- looper:一个线程可以产生一个looper对象,looper相当于一个messageQueue管理人员,它不停的循环遍历messageQueue队列,然后将符合条件的message一个个的拿出来交给handler处理
【注意】handler是在UI线程中声明的,如果我们直接用类似代码执行一个线程的话,实际上并没有创建一个新的线程,因为handler已经跟默认的UI线程中的looper绑定了
使用场景
子线程和主线程之间通信的工具,例如,网络图片加载,耗时请求等操作,子线程和UI线程交互编辑控件属性等。一般在主线程中定义,将一些耗时的操作放在子线程,防止系统ANR异常。
分发消息的方法
- post(Runnable)
- postAtTime(Runnable , long) –> handler.postAtTime(r,System.currentTimeMillis()+100000);
- postDelayed(Runnable , long) –> handler.postDelayed(r,2000);
- sendEmptyMessage(int)
- sendMessage(Message)
- sendMessageAtTime(Message , long)
- sendMessageDelayed(Message , long)
示例
不是很难,网上有很多handler示例,例如进度条控制之类的,请自行百度吧。
补充图示
在网上看到了些很形象的图示,拿来补充分享
转载请注明出处http://blog.csdn.net/zifeng1203s/article/details/44099553