为什么Android官方废弃SoftRefrerence软引用和WeakReference弱引用,而拥抱LruCache?

简介: 为什么Android官方废弃SoftRefrerence软引用和WeakReference弱引用,而拥抱LruCache?一些具有Java背景的研发者喜欢使用软引用(SoftRefrerence)和弱引用(WeakRe...

为什么Android官方废弃SoftRefrerence软引用和WeakReference弱引用,而拥抱LruCache?


一些具有Java背景的研发者喜欢使用软引用(SoftRefrerence)和弱引用(WeakReference)来缓存Java对象和数据,但是如果在Android中仍然使用软引用(SoftRefrerence)和弱引用(WeakReference),会极易导致Android程序闪退崩溃,谷歌Android官方从Android 3.0以后,强烈建议开发者不要在Android中使用软引用(SoftRefrerence)和弱引用(WeakReference),Android的谷歌官方解释(原文):
Note: In the past, a popular memory cache implementation was a SoftReference or WeakReference bitmap cache, however this is not recommended. Starting from Android 2.3 (API Level 9) the garbage collector is more aggressive with collecting soft/weak references which makes them fairly ineffective. In addition, prior to Android 3.0 (API Level 11), the backing data of a bitmap was stored in native memory which is not released in a predictable manner, potentially causing an application to briefly exceed its memory limits and crash.
官方文档链接见附录3。
这段内容大致翻译出来是这样的(英文对照翻译):
Note: In the past, a popular memory cache implementation was a SoftReference or WeakReference bitmap cache, however this is not recommended. Starting from Android 2.3 (API Level 9) the garbage collector is more aggressive with collecting soft/weak references which makes them fairly ineffective. In addition, prior to Android 3.0 (API Level 11), the backing data of a bitmap was stored in native memory which is not released in a predictable manner, potentially causing an application to briefly exceed its memory limits and crash.

注意!在过去,一个非常流行的内存缓存实现是通过SoftReference或WeakReference对bitmap进行缓存,然而现在不推荐使用这种方案实施内存缓存了。从Android系统版本2.3 ( API Level 9 )以后,garbage collector(译者注:Java垃圾回收器)会更加积极的回收持有软/弱引用对象,这导致软引用和弱引用变的相当无能为力。除此之外,在Android系统版本3.0 ( API Level 11 )之前,在本地内存中缓存一个bitmap数据并不会以预期的方式释放,这可能导致一个应用在很短期间就超越它的内存上限(译者注:进而会引发OOM,Out Of Memory)而导致应用崩溃。
同样在官方文档链接下面,谷歌Android官方给出了在Android中处理缓存应该使用什么样的缓存策略:采用LruCache。关于LruCache,请看我过去写的附录文章1和2。
时至今日,网上搜一搜Android缓存技术,有感于当下竟然还有一些文章在给开发者推荐使用SoftRefrerence软引用和WeakReference弱引用缓存数据,不禁令人唏嘘。


附录:
1,《使用Android新式LruCache缓存图片,基于线程池异步加载图片》链接:https://blog.csdn.net/zhangphil/article/details/44082287 
2,《使用新式LruCache取代SoftReference缓存图片,Android异步加载图片》链接:https://blog.csdn.net/zhangphil/article/details/43667415 
3,Android谷歌官方解释为何要极力避免在Android程序中使用WeakReference弱引用与SoftReference软引用?谷歌官方英文文档链接地址:http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
相关文章
|
存储 数据库 Android开发
🔥Android Jetpack全解析!拥抱Google官方库,让你的开发之旅更加顺畅无阻!🚀
【7月更文挑战第28天】在Android开发中追求高效稳定的路径?Android Jetpack作为Google官方库集合,是你的理想选择。它包含多个独立又协同工作的库,覆盖UI到安全性等多个领域,旨在减少样板代码,提高开发效率与应用质量。Jetpack核心组件如LiveData、ViewModel、Room等简化了数据绑定、状态保存及数据库操作。引入Jetpack只需在`build.gradle`中添加依赖。例如,使用Room进行数据库操作变得异常简单,从定义实体到实现CRUD操作,一切尽在掌握之中。拥抱Jetpack,提升开发效率,构建高质量应用!
596 4
|
Android开发
Android官方下拉刷新控件SwipeRefreshLayout
Android官方下拉刷新控件SwipeRefreshLayout
899 0
Android官方下拉刷新控件SwipeRefreshLayout
|
小程序 物联网 Java
Android 蓝牙BLE开发从官方源码demo开始(一)
Android 蓝牙BLE开发从官方源码demo开始(一)
|
JSON Android开发 数据格式
Android框架-Google官方Gson解析,android开发实验报告总结
Android框架-Google官方Gson解析,android开发实验报告总结
|
存储 前端开发 测试技术
Android 官方架构中的 UseCase 该怎么写?
Android 官方架构中的 UseCase 该怎么写?
479 0
|
Java 开发工具 Android开发
SLS:使用 OTel 官方 SDK 采集 Android、iOS Trace 数据实践
本文介绍了使用 OTel 官方 SDK 采集 Android、iOS Trace 数据实践。
1413 7
SLS:使用 OTel 官方 SDK 采集 Android、iOS Trace 数据实践
|
SQL 数据库 Android开发
Android官方数据库框架-Room
Android官方数据库框架-Room
1495 0
|
Shell API 开发工具
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(2)
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(2)
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(2)
|
API 开发工具 Android开发
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(1)
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(1)
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(1)
|
缓存 算法 Java
Android 内存缓存框架 LruCache 的实现原理,手写试试?
在之前的文章里,我们聊到了 LRU 缓存淘汰算法,并且分析 Java 标准库中支持 LUR 算法的数据结构 LinkedHashMap。当时,我们使用 LinkedHashMap 实现了简单的 LRU Demo。今天,我们来分析一个 LRU 的应用案例 —— Android 标准库的 LruCache 内存缓存。
409 0