background image

WeakReference bitmap 缓存,
但是不推荐使用这种方式。从 Android 2.3 (API Level 9) 开始,垃圾回收开始强制的回收掉 
soft/weak 

 

引用 从而导致这些缓存没有任何效率的提升。
 

另外,在 Android 3.0 (API Level 11)之前,这些缓存的 Bitmap 数据保存在底层内存(native 
memory)中,并且达到预定条件后也不会释放这些对象,从而可能导致
程序超过内存限制并崩溃。

 

在使用 LruCache 的时候,需要考虑如下一些因素来选择一个合适的缓存数量参数:
程序中还有多少内存可用
同时在屏幕上显示多少图片?要先缓存多少图片用来显示到即将看到的屏幕上?
设备的屏幕尺寸和屏幕密度是多少?超高的屏幕密度(xhdpi 

 

例如 Galaxy Nexus)

设备显示同样的图片要比低屏幕密度(hdpi 

 

例如 Nexus S)设备需要更多的内存。

图片的尺寸和格式决定了每个图片需要占用多少内存
图片访问的频率如何?一些图片的访问频率要比其他图片高很多?如果是这样的话,您
可能需要把这些经常访问的图片放到内存中。
在质量和数量上如何平衡?有些情况下保存大量的低质量的图片是非常有用的,当需要
的情况下使用后台线程来加入一个高质量版本的图片。
这里没有万能配方可以适合所有的程序,您需要分析您的使用情况并在指定自己的缓存
策略。使用太小的缓存并不能起到应有的效果,而使用太大的缓存会消耗更多

 

的内存从而有可能导致 java.lang.OutOfMemory 异常或者留下很少的内存供您的程序其他
功能使用。

 

下面是一个使用 LruCache 缓存的示例:
private LruCache""> mMemoryCache; 
                                                               
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    // Get memory class of this device, exceeding this amount will throw an 
    // OutOfMemory exception. 
    final int memClass = ((ActivityManager) context.getSystemService( 
            Context.ACTIVITY_SERVICE)).getMemoryClass(); 
                                                               
    // Use 1/8th of the available memory for this memory cache. 
    final int cacheSize = 1024 * 1024 * memClass / 8; 
                                                               
    mMemoryCache = new LruCache"">(cacheSize) { 
        @Override 
        protected int sizeOf(String key, Bitmap bitmap) { 
            // The cache size will be measured in bytes rather than number of items. 
            return bitmap.getByteCount(); 
        } 
    }; 
    ... 
}                                                               

                     找软件资料,就到一览软件文库

http://wk.yl1001.com/rj/