Android Handler机制简述(一)

来源:互联网 发布:大中华帝国史 淘宝 编辑:程序博客网 时间:2024/04/27 06:16

最近一直在看Android,在写UI和网络的时候,多次遇到Handler这种东西,于是乎想深入的了解一下Handler,但开始看了才发现,它并没有那么简单,而且这个知识点又非常的重要,所以我打算把我学到的东西写下来,也算是一种巩固,这是我第一次写博客,参考了其他人写的一些知识点,技术也很不成熟,有问题也需要大家来指正。

Handler主要应用在多线程之中,用的是Thread和Runnable,Java使用多线程的情况主要有三点:1.I/O操作2.复杂的运算3.计时操作。而多线程非常需要注意的就是线程安全问题,在Java程序中,我们用Lock和Synchronized来保证线程安全,而在Android中,谷歌提供了一个非常好的方法,那就是Handler,大大简化了线程安全的操作。举个例子,Handler用的最多的就是我们如果在子线程中改变UI界面,会造成线程安全问题导致程序崩溃,这个时候,就需要子线程通过Handler将信息传给UI线程简介改变UI。那么为什么不直接在UI线程改变呢,这是因为,如果改变UI的操作时间过长会造成界面“卡死”的现象,影响用户体验。

每个线程都会产生一个Looper对象,负责Handler和Message Queue的交互,Message queue负责储存传入的Message并按先后顺序传递给Looper,这也保证了不会造成线程冲突,Looper由于是一个死循环,所以,他的作用就是源源不断的将消息队列中的Message获取到并发送给Handler,相当一个中间桥梁,也是Handler实现的核心。
接下来是Handler涉及到的多个问题。
一、同一个HandlerThread可以有多个Handler,并且这两个Handler不会互相混淆。
二、Handler并不是可以创建到任意线程,必须是有调用过Looper.prepare()的HandlerThread才可以,继承HandlerThread的子类都必须默认重写onLooprPrepare()方法才可以创建线程安全的Handler对象。如果不想写一个继承HandlerThread的内部类在类中创建Handler,那么在子线程中创建Handler的时候,需要给它一个参数参数为一个抽象类,需要重写它的方法Handler handler = new Handler(Looper.getMainLooper{
@Override
public void handleMessage(Message msg){
}});
这样就可以使用主线程的Looper,主线程已经默认调用了Looper.Prepare(),或者使用(new HandlerThread).getLooper调用创建Handler线程的Looper,除此之外还有一种方法就是在创建Handler之前,首先认为的调用一下Looper.Prepare(),并且在最后调用Looper.loop()以保证Looper从Message Queue中源源不断的取出Message。
三、同一个Handler接收到的Message不会出现交叉,只有一条执行完,才会执行下一条。
四、有的时候,一条Message被发送了好多次,但只需要它相应依次就好,那么就要调用HandlerThread的removeMessage()方法,删掉除正在进行的Message以外的其他所有Message。这个方法并不会中断当前Message的执行。

待续。。。。。。

0 0