您的位置:首页 > 其它

防止handler内存泄漏

2016-05-21 13:54 260 查看
内存泄漏:程序运行会用到内存,在退出程序的时候,占用内存的数据没有释放,那么当数据越来越多的时候,就会产生内存泄漏。

handler为什么会内存泄漏呢,handler是个内部类,内部类会持有外部类的引用,内部类需要依赖外部类。handler需要定义为静态类,当你推出Activity,handler还在工作,

下面是引起内存溢出的:Activity已经finish,但handler还在工作

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myhandler.postDelayed(new Runnable() {
@Override
public void run() {
System.out.println("存在");
}
}, 1000*60*10);
finish();
}
private Handler myhandler=new Handler(){
public void handleMessage(android.os.Message msg) {

};
};
}


解决方法:用软引用并用静态内部类

/**
*
* @author Administrator 定义一个内部类时,会默认引用外部类对象的引用,当使用内部类时,使用static定义为静态内部类
*         引用:强引用(new) 软引用,弱引用
*/
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler.postDelayed(new Runnable() {
@Override
public void run() {
System.out.println("存在");
}
}, 1000 * 60 * 10);
finish();
}

private  myhanler handler=new myhanler(this);
private static class myhanler extends Handler {
WeakReference<MainActivity> activity;
public myhanler(MainActivity main) {
activity = new WeakReference<MainActivity>(main);
}
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if (activity.get()!= null) {

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