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官网具体是如何描述的,
原文,
- 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.
- 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.
- Note: 在过去,一种比较流行的内存缓存实现方法是使用软引用(SoftReference)或弱引用(WeakReference)对Bitmap进行缓存,
- 然而我们并不推荐这样的做法。从Android 2.3 (API Level 9)开始,垃圾回收机制变得更加频繁,这使得释放软(弱)引用的频率也
- 随之增高,导致使用引用的效率降低很多。而且在Android 3.0 (API Level 11)之前,备份的Bitmap会存放在Native Memory中,
- 它不是以可预知的方式被释放的,这样可能导致程序超出它的内存限制而崩溃。