内存泄漏案例以及优化

Android内存泄漏

  • 页面A即将关闭、但是页面或者是对象B持有页面A的引用,这时就会导致页面A的对象多为Context无法回收,这时就会导致内存泄漏

    • 一般体现是:单例模式创建静态变量时-持有页面的context,也常用于MVP-Persenter。

      • 单例模式处理一般context获取其Application层面的context
      • 使用Application层面的context并不会因为持有context是系统级别的不会被回收,:回收是对象A回收时,没有其他对应引用A
    • 使用内部类对象时没有对内部类引用进行弱引用处理。

      • 内部类在创建对象时内部会获取外部类的引用、这样其才可以不限制使用外部类的变量或者是方法(类与类的作用域方法变量是分开的即使是内部类与外部类),所以在创建内部类时一般会用静态内部类,因为静态内部类创建时不包含外部类的引用
    • 内部类经典案例Handler

      • 不规范的handler

内存泄漏案例以及优化

`这里的handler也是一个非静态匿名内部类,他跟上面的一样,也会持有Activity的引用,我们知道handler是运行在一个Looper线程中的,而Looper线程是轮询来处理消息队列中的消息的,假设我们处理的消息有十条,而当他执行到第6条的时候,用户点击了back返回键,销毁了当前的Activity,这个时候消息还没有处理完,handler还在持有Activity的引用,这个时候就会导致无法被GC回收,造成了内存泄漏。`
  • 正确的做法是:

内存泄漏案例以及优化

`该案例也说明了两点:1、内部类创建时静态内部类操作外部类对象时需要外部类对象,这时对外部类对象进行弱引用    
					2、内部类对象例如Handler正常第一种创建、其在使用的时候就是个内部类内部可以调用外部的对象就是持有外部的引用,这也是为什么会要继承Handler创建对象的原因`

待续…

参考