不需要使用WeakReference来避免内存泄露
原文地址:WeakReference in Android – Google Developers Experts – Medium
一个同事最近提到他看到的一句描述:
如果你是一个Android开发者,如果不使用WeakReferences,你就有问题。
我自己认为,这句话就算不是一个错误的结论,也是完全误导人的。WeakReference应该被当做修复内存泄露的最后一步。
今天,我在Google Developers Experts上面发现了发布的这篇文章:
Finally understanding how reference work in Android and Java
这是一篇非常棒的文章,用示例总结了references在Java中是如何工作的。
这篇文章并没有说我们一定要使用WeakReference,但是也没有给我们其他的可选项。我觉得我一定要给一个不是必须使用WeakReference的替代选择。
如果你不使用WeakReference你也没有任何毛病。
我相信在每个地方都使用WeakReference并不是最好的选择,使用WeakReference去解决内存泄露的问题证明你缺乏建模思想。
尽管文章中给出了解决潜在的内存泄露,这里还有其他的方法,我将会给出几种解决方案来避免在后台线程中执行长时间的任务所导致内存泄露的问题。
一个简单的示例来解决AsyncTask导致内存泄露的问题:
这里是我的Activity:
AsyncTask这里是我的AsyncTask:
AsyncTask这个解决方案,我知道很基本,但是足以展示另一种解决方案。
下面是另外一种使用Rxjava的解决方案:
Rxjava这里如果我们没有unSubscribe的话,还是会存在内存泄露的。
最后我推荐给大家一下示例,都是一些值得学习的资源,他们没有任何WeakReference。
我坚信的一条准则就是不要把内部类设置为静态的,即使他们没有在后台处理耗时的任务,更好的是,我们可以把他们移到一个完整的属于他们自己的类。
使用非静态的内部类执行耗时的后台任务也是一个不好的选择,即使不是在Android中。