美文网首页
App性能_02_handler

App性能_02_handler

作者: lww文 | 来源:发表于2020-09-17 18:06 被阅读0次

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

            }

    };

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

    相关文章

      网友评论

          本文标题:App性能_02_handler

          本文链接:https://www.haomeiwen.com/subject/ktxryktx.html