目前主要有两种解决方案:
•第一种,在activity关闭时,停掉该子线程,然后调用handler的removeCallbacks方法,把消息队列中的message删除掉。
•第二种,让匿名内部类作为一个静态内部类出现,这样就不持有activity的对象引用了,activity就可以被回收掉了。但是,不持有activity的引用,怎么操作其中的对象呢?只好自己声明一个弱引用了:
static class myHandler extends Handler {
WeakReference<Activity > mActivityReference;
myHandler(Activity activity) {
mActivityReference= new WeakReference<Activity>(activity);
}
@Override
public void handleMessage(Message msg) {
//消息处理......
}
}
弱引用在垃圾回收的时候会被忽略,所以可以被安全回收。个人比较倾向于第二种写法,比较简单。
总结
本文简单介绍了Android系统线程之间异步通信的机制,从源码的角度简单谈论了线程通信时的基本工作。其中未详细深入到messageQueue的具体管理操作,只是简单提及了message对象的回收,具体细节有空再补上。