为什么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
相关文章
|
3月前
|
存储 前端开发 测试技术
Android 官方架构中的 UseCase 该怎么写?
Android 官方架构中的 UseCase 该怎么写?
66 0
|
小程序 物联网 Java
Android 蓝牙BLE开发从官方源码demo开始(一)
Android 蓝牙BLE开发从官方源码demo开始(一)
|
10月前
|
SQL 数据库 Android开发
Android官方数据库框架-Room
Android官方数据库框架-Room
573 0
|
12月前
|
缓存 Java Android开发
Android使用LruCache、DiskLruCache实现图片缓存+图片瀑布流
**本文仅用于学习利用LruCache、DiskLruCache图片缓存策略、实现瀑布流和Matix查看大图缩放移动等功能,如果想用到项目中,建议用更成熟的框架,如[glide]
130 0
|
12月前
|
存储 缓存 算法
Android内存缓存LruCache源码解析
内存缓存,使用强引用方式缓存有限个数据,当缓存的某个数据被访问时,它就会被移动到队列的头部,当一个新数据要添加到LruCache而此时缓存大小要满时,队尾的数据就有可能会被垃圾回收器(GC)回收掉,LruCache使用的LRU(Least Recently Used)算法,即:<strong>把最近最少使用的数据从队列中移除,把内存分配给最新进入的数据。</strong>
|
Android开发
Android官方下拉刷新控件SwipeRefreshLayout
Android官方下拉刷新控件SwipeRefreshLayout
608 0
Android官方下拉刷新控件SwipeRefreshLayout
|
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 内存缓存。
138 0
DHL
|
存储 算法 安全
Android 13这些权限废弃,你的应用受影响了吗?
在 Android 13 上废弃了文件访问权限,提供了一种选择媒体文件的工具,代替这些废弃的 API,而不需要授予对其整个媒体库的访问权限
DHL
603 0
Android 13这些权限废弃,你的应用受影响了吗?