作用:个人感觉就是管理线程的消息队列的,比如在管理主线程的消息队列的时候,会把一些复杂的操作放到其他线程做操作,然后把最后的结果加到主线程的消息队列里,然后触发handleMessage进行处理
解决办法:静态内部类+ 弱引用
使用:大家用的时候 肯定会考虑到如何防止内存泄漏的问题
问题1:为什么handler会引起内存泄漏
我们都知道 非静态的内部类或是匿名类回持有外部类的引用,这样的话在一个Activity中,handelr持有activtiy的对象的引用,当handler还没有执行完毕,但是关闭activtiy,正常activtiy关闭了就会被回收,但是handler还没有释放,还持有者activity的对象,这样activity的对象即使在内存不足的时候也不会被回收,这样反复操作,多了的话就会容易出现oom
问题2:为什么静态内部类+ 弱引用可以解决
静态的内部类不回持有外部类的引用,但是这样我们又拿不到当前activtiy的对象了,所以加个弱引用,这样的话,我们即能不持有外部类的引用,也能获取到当前activtiy的对象,当handler没有处理完毕,就关闭的activtiy的时候,因为是弱引用,GC也一样会回收 activtiy这个对象的,这样就解决了
下面是个简单的例子
private static class MyHandler extends Handler {//定义成静态的内部类
WeakReference<MainActivity> weakReference;//弱引用
MyHandler(MainActivity activity) {
weakReference = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
MainActivity activity = weakReference.get();
switch (msg.what) {
case 1:
activity.textView.setText((String) msg.obj);
break;
default:
break;
}
}
}