handler通讯机制

Android应用开发有个默认规则,不在UI线程做耗时操作。耗时操作结果反馈给用户也不能直接更新UI。

耗时操作必须开子线程去做,实现的方式很多,handler、asynctask、service。。。每个人偏好不同,但是各有各的优点,根据不同的需求选择适当的实现方式,是我一直追求的目标,每一种至少要会用,用的多了就会去想,去理解。

关于handler,刚开始用的时候有些难以理解,跟他绕在一起的message、looper、thread还有messagequeue,这么久了,有点明白了,他们的关系大概是这样的:

handler通讯机制_第1张图片


每一个线程想要通过handler来通讯,首先要有一个looper,looper与线程是1:1的,可以没有,但是最多只有一个。looper,底层的源码在实例化的时候,给自己实例化了一个messagequeue,所以它俩也是1:1,相当于messagequeue绑定在looper内部的。有了这两个,还得有一个handler,用来接收和发送message,这样结构就搭建好了。

当产生线程间通讯的需要了,先new 一个message或者handler.obtainMessage(),将信息装载进message,给message设置一些属性(比方说target),然后用handler扔给looper,looper一直轮询的读取自己的messagequeue,有就读出来处理掉,没有就阻塞等待,当looper,读取到了message,就将他交给相应的handler,handler有个基本上必须覆盖的方法handlemessage(),用来处理message身上的信息,完成了不同线程之间的通讯。


总结几点:

1、UI线程(主线程)也遵循必须有looper的条件,不过是因为系统隐式的创建好了,所以代码中没有体现;

2、thread:looper == 1:1(可以没有,最多一个),looper:messagequeue == 1:1(有且仅有一个),messagequeue:message == 1:n(数量任意),message:handler == n:1(反正我是没用过一个message可以发个多个handler) ,handler:looper == n:n(他们之间好像没什么关系,有关系的是message)。

3、message通过target和callback来确定将要去的handler,不管来的handler,其中callback优先于target。

你可能感兴趣的:(且行且远,[上下求索])