1:编写一个内存泄漏
===================================
public class MainActivityextends AppCompatActivity {
private int NUM=666;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler.sendEmptyMessageDelayed(NUM,1000);
}
private Handlerhandler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
handler.sendEmptyMessageDelayed(NUM,1000);
}
};
}
==================================
2:使用profiler 工具 查看 内存momory
====================================
MainActivity$1 是 MainActivity 的内部类=======================================优化一下代码
==================== onDestroy 移除handler
@Override
protected void onDestroy() {
super.onDestroy();
handler.removeMessages(NUM);
}
====================== 再次运行 然后 退出
、=====================
我们可以导出 分析文件 使用 mat 工具 分析 具体哪个地方出现 泄漏
==================上面代码早成泄漏的原因
1: Activity 中的 内部类 handler 持有Activity 的引用 (当Activity 生命周期没有结束 handler 就会一会引用 Activity )
2: 假设 handle 和GC 回收机制 有关系 Activity 和handler 有关系 所以Activity 不会被回收
3; 长生命周期 (handle )对 短生命周期()进行了持有 会导致 短生命周期 一直绑定这长生命周期
handle 不做任务操作 也不会早成泄漏
============解决内存泄漏
使用 static 修饰 handler 之后 activty销毁了但是 内部类引用还在 因为使用 static 修饰之后handler 的生命周期跟 activity 无关 尽量别使用static
===================================
public class MainActivityextends AppCompatActivity {
private static int NUM=666;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler.sendEmptyMessageDelayed(NUM,1000);
}
private static Handlerhandler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
handler.sendEmptyMessageDelayed(NUM,1000);
}
};
=====================================
网友评论