Handler的三种交互场景

来源:互联网 发布:台湾绿瓦5.5膛线数据 编辑:程序博客网 时间:2024/06/02 10:00

前些天有朋友问了我一个问题,他说他在面试平安的时候,面试官问了一个这样的Question:Handler有哪三种交互场景?

其实,当我听到这个问题的时候,我脑海中闪现的想法是面试官其实在考Handler在子线程的实现方式。没错,其实Handler的交互方式可以分为如下三种:

(1)子线程与子线程交互

(2)主线程发送消息到子线程

(3)子线程发送消息主线程

乍一看,其实上面的(2)和(3)原理是差不多的,我们可以理解成是双向的关系。

我之前写过一篇从源码角度分析Handler的博客,其中就分析到了为什么我们可以在UI线程(也就是主线程)直接使用Handler发送消息。如果对这块了解了,那么今天的这三个问题就很容易。还没有看的小伙伴点击这里:玩转Android Handler

下面的内容我会以代码的方式来分别和大家分析3种的实现方式。

(1)子线程与子线程交互

可能突然看这个问题,就有点无所适从。不过仔细想想,然后联想主线程的Handler就很容易理解了。你可以把主线程也当做一个子线程,这样想这个问题就迎刃而解了。这种情况同时也分为了如下两种场景:


 1>子线程中使用Handler向另一个子线程发消息(单向)


即创建两个线程,并在一个线程发送消息到另一个线程处理。代码很简单,相信大家一看就懂。

2>两个子线程互发消息(双向)


上面代码中,分别创建了两个线程MyThread1和MyThread2的实例。并且通过各自线程的Handler向对方发送消息。

(2)主线程发消息到子线程。

既然是主线程发消息到子线程,那么Handler的处理肯定是在子线程。那么我们就需要在子线程中去创建Handler。还记得我们之前分析源码的时候我们说过,Handler的使用离不开Looper的支持。主线程可以使用Handler的原因是因为ActivityThread在创建的时候默认帮我们创建了Looper。即MainLooper。现在我们要在子线程中去创建Handler,那么就需要我们手动去创建Looper。OK,看如下代码:


从上面代码可以看到,我们在子线程中创建了Looper。在主线程Button的单击事件中去发送消息。子线程中接受到消息后处理。相信大家一看便知。

其实还有一种实现方式,想必大家平时用的不是特别多,就是使用HandlerThread类来实现。

HandlerThread,顾名思义,可以简单理解为一个Handler线程类。我们使用该类就可以创建一个Handler的线程类,然后将其和Handler绑定起来,然后Handler的处理就在该线程中执行了。同样看代码就可以很清楚的明白其中的原理:


总之,记住一点就可以了。Handler的使用离不开Looper的支持,要想在子线程中使用Handler,Looper的创建必不可少。

第三个子线程发送消息到主线程就不再多说了,我们平时都在接触。Ok,关于Handler的三种交互场景就介绍到这里了,相信大家对Handler又有了新的认识。有问题的筒靴可以给我留言啦~




1 0
原创粉丝点击