不需要使用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。

bonfier-firebase-sample

spikes

如果存在内部类的情况下,则使用静态内部类。如果这些内部类执行耗时的操作的话,那么建议迁移到单独的类中来操作。

使用非静态的内部类执行耗时的后台任务也是一个不好的选择,即使不是在Android中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,090评论 25 709
  • 一、基础知识 1、什么是内存泄露 java中的内存泄露是指一个无用对象持续占有内存或无用对象的内存得不到及时的释放...
    LiveMoment阅读 9,885评论 0 20
  • 敬笃 生命本就是一场的旅途,每一个站点,都是一段插曲,那些未知的调子,和时间有关! 匆忙的行路人,带着迥异的表情包...
    山谷小道士阅读 3,229评论 2 2
  • 多态的作用是消除类型之间的耦合关系。 8.2 转机 除了static方法和final方法(private方法属于f...
    Lemon_Home阅读 1,475评论 0 0