Q:你们Android开发如何实现线程间通信呢?
A:(这时候,完全确定他不懂Android开发了)Android在4.0之后就规定不能在主线程中进行耗时操作,Activity、Service等耗时不能超过5秒,否则就会报出ANR(Application Not Responding)错误,所以对于耗时的操作,如网络请求、加载本地数据等需要单独搞个线程去执行,当执行完成后又需要更新UI,所以就需要子线程和UI线程进行通信。在Android中提供了Handler帮我们实现消息通信。每个线程都对应一个Looper对象,在looper对象中维护了一个消息队列MessageQueue。应用的UI线程启动后,looper就会初始化一个消息队列,然后开始轮询MessageQueue,我们常常会在主线程创建一个Handler并重写handlerMessage()方法,然后再子线程调用了handler.sendMessage(msg)方法把消息发送出去,其实就是发送到主线程looper的消息队列中,发送之前msg会把发送它的handler设置成它的tag对象保存起来,在消息队列轮询到这个消息msg后,先读取它的tag对象,就知道是哪个handler发送过来的,然后显式的调用handler对象的handlerMessage即可,至此,就实现了线程间的通信。
我现在开发做开发都用的EventBus去做线程间通信,而不会直接使用handler+子线程,容易出现内存泄漏问题,比如在Activity界面开启一个子线程去执行耗时任务,这时候假设按返回键,activity执行finish方法,对象按理应该被回收销毁,但如果子线程还在执行,子线程保存了对外部activity对象的强引用,那么activity就不会被销毁,内存泄漏问题就出现了。