您的位置:首页 > 其它

Handler内存泄露的改进(18)

2016-02-27 00:00 423 查看
摘要: Handler内存泄露问题:(退出程序时,Handler还持有外部类对象的引用,所以就算主Activity退出了,实际还没退出,还在运行,浪费内存)
解决方式: 1.定义一个内部类的时候,会默认持有外部类的引用,所以定义一个内部类的时候最好定义为静态内部类,因为静态不依赖于内部类的对象引用
2.使用弱引用 强应用(即我们经常new的对象的方式,它不会回收内存)》软引用(即没有内存时才去回收内存)》弱引用(即引用的对象不存在就得不到引用)

//平时我们用以下这种写法会存在内存泄露
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
if (msg.what == 1) {
text_show.setText((String) msg.obj);
}
};
};
//所以为了改进这个,以下方式使用了弱引用的方式来声明,对上面的这种方法进行改进
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

// hangdler使用弱引用进行内存泄露优化
private final MyHandler handler = new MyHandler(this);//this代表了传入的Activity

// 建一个静态内部类
private static class MyHandler extends Handler {
// 弱引用对象
WeakReference<MainActivity> weakReference;

// 定义一个构造函数,传入一个MainActivity
public MyHandler(MainActivity activity) {
weakReference = new WeakReference<MainActivity>(activity);
}

// 实现Handler里面的方法
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 通过软引用对到MainActivity对象进行引用
MainActivity activity = weakReference.get();
if (activity != null) {// 如果MainActivity没有退出,获取到的不是空你才进行下一步操作进行发送消息

}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: