Android的缓存

 Android应用开发好多场景都是手机和web服务器之间进行通信,从服务端需要获取数据,但是当访问的数据比较大,比较多,并且是重复数据时,会极大影响性能,甚至应用崩溃,手机卡死,这时候就要考虑缓存机制了!Android中可通过缓存来减少频繁的网络操作,减少流量、提升性能。

    在实际开发中,缓存机制使用最频繁的便是图片缓存!目前大部分的App都是图文结合,从web服务器获取文字和图片,文字显示很快,图片基本上是先下载到手机本地,然后再显示,如果图片很多、很大,每次加载同一张图片,都去网络下载,那么App渲染的速度是比较慢的,这样的体验很差!所以,类似这样的场景,便要使用缓存机制!

     目前缓存机制使用大致流程是,当App需要加载某一张图片时,先去手机内存中去找该图片,如果有,那么直接显示,如果无,则去手机sd卡或者手机外部存储中找该图片,如果有,那么直接显示,如果无,那么此时才去网络下载该图片。这种机制常称为三级缓存策略。

      三级缓存策略,首先从内存中加载图片,因为从内存中获取图片速度是最快的,但是由于内存的有限的,所以缓存的图片也是有限的!所以从内存缓存使用LRUcache。外部缓存即磁盘缓存,相比内存缓存而言速度要来得慢很多,但容量很大,这里的使用的是DiskLruCache。

        Android的缓存机制是基于Java的缓存机制。Java的缓存机制有四种,强引用、软引用、弱引用和虚引用。着重看看软引用(SoftReference)和弱引用(WeakReference)。

1.  软引用(SoftReference)。

    如果一个对象具有软引用,内存空间足够,垃 圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高 速缓存。使用软引用能防止内存泄露,增强程序的健壮性。

2. 弱引用(WeakReference)。

    如果一个对象只具有弱引用,那么在垃圾回收器线程扫描的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。弱引用也可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

    两者的区别 

弱引用与软引用的根本区别在于:只具有弱引用的对象拥有更短暂的生命周期,可能随时被回收。而只具有软引用的对象只有当内存不够的时候才被回收,在内存足够的时候,通常不被回收。

   以上的描述是从Java方面给出的,但是在2.3版本后,Google不建议使用这两种缓存机制!那么看看Google官网具体是如何描述的,

原文,

[java]  view plain  copy
  1. Note: In the past, a popular memory cache implementation was a SoftReference or WeakReference bitmap cache,   
  2. however this is not recommended. Starting from Android 2.3 (API Level 9) the garbage collector is more aggressive   
  3. with collecting soft/weak references which makes them fairly ineffective. In addition, prior to Android 3.0 (API Level 11),   
  4. the backing data of a bitmap was stored in native memory which is not released in a predictable manner, potentially causing   
  5. an application to briefly exceed its memory limits and crash.  
[java]  view plain  copy
  1. Note: In the past, a popular memory cache implementation was a SoftReference or WeakReference bitmap cache,   
  2. however this is not recommended. Starting from Android 2.3 (API Level 9) the garbage collector is more aggressive   
  3. with collecting soft/weak references which makes them fairly ineffective. In addition, prior to Android 3.0 (API Level 11),   
  4. the backing data of a bitmap was stored in native memory which is not released in a predictable manner, potentially causing   
  5. an application to briefly exceed its memory limits and crash.  
翻译,

[java]  view plain  copy
  1. Note: 在过去,一种比较流行的内存缓存实现方法是使用软引用(SoftReference)或弱引用(WeakReference)对Bitmap进行缓存,  
  2. 然而我们并不推荐这样的做法。从Android 2.3 (API Level 9)开始,垃圾回收机制变得更加频繁,这使得释放软(弱)引用的频率也  
  3. 随之增高,导致使用引用的效率降低很多。而且在Android 3.0 (API Level 11)之前,备份的Bitmap会存放在Native Memory中,  
  4. 它不是以可预知的方式被释放的,这样可能导致程序超出它的内存限制而崩溃。  
[java]  view plain  copy
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值