美文网首页
内存优化实战

内存优化实战

作者: 勇敢地追 | 来源:发表于2020-09-08 09:27 被阅读0次

    最近,因为项目时间不紧的原因,就对项目的某些页面进行了内存观察,发现了两处优化点.特意记录下来

    1.单例引发的内存泄漏

    我在项目中涉及到的一个单例是这样的

    object LiveCenter {
        ......
        var function: Function1<Boolean, Any>? = null
    
        fun registerListener(function: Function1<Boolean, Any>?) {
            this.function = function
        }
        ......
    }
    

    LiveCenter 注册了一个监听.这个 Function1 是在 Fragment 中 new 了一个实例.这个时候 LiveCenter 就持有了 Fragment 的引用导致内存泄漏.所以需要写一个 release 方法,在 release 方法中使 function = null
    这个和常说的 Context 引发内存泄漏其实差不多.这个可以通过 Android Studio 自带的 Android Profiler.具体用法自己搜吧

    2.Fragment 作为 Listener 引发的内存泄漏

    有的时候为了方便我们会这么写

    public class Instance {
        public Instance(Listener listener) {
            this.listener = listener;
        }
    }
    
    public class FragmentA extends BaseFragment implements Listener {
    }
    

    这么写很常见,如果只是 FragmentA 每 new 一次, Instance 也 new 一次.那么就没啥问题.但如果 FragmentA 对应的 Activity 是 SingleTask 模式.也就是说 FragmentA 可能会多次整个刷新,导致了每次都 new Instance.每次 new 就多了一个引用导致内存泄漏.所以在这种情况下一定要注意把那个 listener 置为 null

    相关文章

      网友评论

          本文标题:内存优化实战

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