Handler设计初衷:处于性能的考虑,android的UI线程不是操作安全的,这就意味着如果多个线程同时操作UI线程,就会引发安全问题,为了解决这个问题,android定了一条规则,只有UI线程才可以更新UI。
那么问题来了,如果其他线程想要更新UI怎么办呢,这时候就需要用到Handler的消息传递机制了。Handler的作用主要有两个:
1,在新线程中发送消息给UI线程;
2,在UI线程中接收这个消息类更新UI;
常用方法有下面几个:
handleMessage():处理消息的方法,该方法经常被重写;
hasMessages():检查消息队列中是否包含what属性为指定值的消息;
sendEmptyMessage():发送空消息;
sendEmptyMessageDelayed():指定多少毫秒后发送消息;
sendMessage():立即发送消息;
sendMessageDelayed():指定多少毫秒后发送消息;
很多时候Handler并不是单独使用的而是配合其他的组件一起完成任务:
Message:Handler接收和处理的消息对象;
Looper:每个线程只能拥有一个Looper,它的loop方法负责读取MessageQueue中的消息,读到消息之后就把消息交给发送改消息的Handler处理;
MessageQueue:消息队列,它采用先进先出的方式来管理Message。程序创建Looper对象时会在它的构造器中创建Looper对象。
相信很多人也用过AsyncTask进行异步传输,下面就来比较一下Handler和AsyncTask的优缺点:
1 ) AsyncTask实现的原理和适用的优缺点
AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
使用的优点:
l 简单,快捷
l 过程可控
使用的缺点:
l 在使用多个异步操作和并需要进行UI变更时,就变得复杂起来.
2 )Handler异步实现的原理和适用的优缺点
在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)àthread(子线程)运行并生成Message-àLooper获取Message并传递给HandleràHandler逐个获取Looper中的Message,并进行UI变更。
使用的优点:
l 结构清晰,功能定义明确
l 对于多个后台任务时,简单,清晰
使用的缺点:
l 在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)