美文网首页基础对移动开发有帮助Android技术知识
不需要使用WeakReference来避免内存泄露

不需要使用WeakReference来避免内存泄露

作者: 小菜鸟程序媛 | 来源:发表于2016-12-06 15:06 被阅读5072次

原文地址: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中。

相关文章

  • 不需要使用WeakReference来避免内存泄露

    原文地址:WeakReference in Android – Google Developers Experts...

  • 闭包中关于内存

    在闭包中,回收使用的对象,避免内存泄露

  • Android性能优化知识列表

    1. 内存泄露 内存泄露原因分析 如何规避内存泄露a. 如何使用高效的Map容器b. 如何避免无意间的自动封箱c....

  • APP开发实战122-APP防止内存泄露

    30.3.2防止内存泄露 1 使用Service时,尽量使用IntentService,这样可以避免忘记关闭服务。...

  • Android性能优化

    1.内存优化 static谨慎使用 善用softreference、weakreference、lrucache ...

  • iOS - 性能优化

    内存方面 检测内存泄露 block使用上的强强循环导致页面不释放 :规范block使用,避免循环不释放 创建很多临...

  • 性能优化之内存泄漏(一)

    一、概念 1.什么是内存泄露 内存泄露是指:当一个对象已经不需要再使用了,本该被回收时,而有另外一个正在使用的对象...

  • iOS:MD5加密

    使用Swift的方法来加密的时候存在内存泄露的问题,但是在OC上使用就不会出现内存泄露;Swift为何会泄露这个还...

  • 5.JVM系列-堆内内存泄露案例分析解决

    目录 一. 背景 二. 内存泄露及原因 三. 常见堆内内存泄露的原因 四. 避免内存泄露的一些事项 五. 常见发生...

  • 安卓内存泄露工具使用

    关于是什么内存泄露,为什么会内存泄露,这里就先不提了,下面只说对于内存泄露我们可以用什么工具来检测。 使用开源工具...

网友评论

  • 空_欢喜:非静态内部类会持有外部类引用,这也是造成内存泄漏的主要原因之一,当然解决方式并非一定要用WeakReference,比如hander发送延时msg这种就可以在activity的onDestroy中通过removeAllMsgAndCalkback解决
  • 01df73cbe9bb:这篇文章抓紧修正吧,非静态内部类会持有外部引用,处理耗时操作就是引发内存泄漏的主要原因之一。
    小菜鸟程序媛:好的,多谢指正
  • hornkyin:我能说博主你翻译的驴头不对马嘴吗,原文明明说信奉静态内部类,到你这儿变成了【我坚信的一条准则就是不要把内部类设置为静态的】,不是误导别人吗
    小菜鸟程序媛:@hornkyin 这个确实是当时翻译的问题,已经纠正过了,多谢提醒
    小菜鸟程序媛:@hornkyin 嗯,可能是我翻译问题,我找时间再去校对一下
  • 7e10845851d5:但是我看下面这篇文章的思路,和你这一篇的正好相反
    https://blog.csdn.net/sinat_31057219/article/details/74533647
    小菜鸟程序媛:@卢木楠 已经修正过了,多谢提醒,给你造成的误解说声抱歉
  • 望北8261:内部类设置为静态的并没有什么问题,问题在引用上面,注意点就行

本文标题:不需要使用WeakReference来避免内存泄露

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