App性能_02_handler

2020-09-17  本文已影响0人  lww文

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);

        }

};

=====================================

上一篇下一篇

猜你喜欢

热点阅读