Android中Handler的线程间通讯原理

在此感谢Sundy老师、Mars老师、若水老师和其他一些无私的工作在Android教育前线的老师们。

今天,我直到今天才刚刚把Android的Handler在线程间的消息传递机制明白了一些。

其实说白了就是要把Handle对象传递的东西放在一个消息循环的队列当中,如果没有这个消息循环队列的话,就会报错!

在做比较简单线程通讯的时候,我们只是在主Activity线程中使用Handler.sendMessage(Message)方法来实现消息的发送,用Handler.handleMessage(Message)类实现消息的获取,这似乎没有什么错误,而且如果在我们自己开启的普通线程中向主Activity线程发送消息似乎也不会有什么错误,可以捕获我们想要的消息。

但是如果我们接收消息的线程不在主线程那么而是一个普通线程,那么就会报错。为什么会这样呢?原因就是因为在我们自定义的普通线程中没有消息循环队列。那么怎么来实现一个消息循环队列呢?(假设我们都复写了handleMessage(Message)方法)

1.这是最简单的方法,是在实例化Handler对象的时候传入调用HandlerThread.getLooper()获得的Looper对象,这个Looper就是我们需要的消息循环队列。当然这个HandlerThread对象必须调用start()方法去让他开启的线程运行。

2.这个方法是模仿HandlerThread类的run()方法写出来的。就是在定义Handler对象的前加上Looper.prepare()方法,让消息循环开始准备,在定义完以后在调用Looper.loop();然消息循环开始运行。其实这两个方法本质上是没有没有区别的,都是给一个普通线程添加了一个消息队列。

那么为什么在Activity中就没有什么问题呢?

原因是Activity其实什么也不是,只是一个大怪物,他把很多功能都整合到了一起,并且把他封装起来,当然也包括一个消息循环队列(这个消息循环队列由系统来维护),所以在简单的主Activity中用Handler传递消息不会报错。有人说Activity是界面其实并不是这样的,我们看到的只不过是一个Window或者View,他用Window的功能监听事件,用View的功能显示界面,还有集成了数据存储等功能,等等。在此只讲Handler,过多的Activity知识这里只做了解。

你可能感兴趣的:(android,工作,教育,存储,通讯)