Java 软引用及在Android中的应用

引用类型:
1.强引用( strong reference):
       String aHelloString=“hello”;
       只要引用存在就不会被回收

2.java提供其他三种引用类型
软引用(SoftReference)
虚引用(WeakReference)
phantom references (java.lang.ref.PhantomReference)

3.主要介绍SoftReference
主要特点是具有较强的引用功能。只有当内存不够的时候才回收这类内存,因此在内存足够的时候,他们通常不被回收。另外,这些引用对象还能保证在Java  抛出OutOfMemory异常之前,被设置为null。他可以用于实现一些常用资源的缓存,实现Cache的功能,保证最大限度的使用内存而不引起OutOfMemory异常。
    使用示例:
    A obj = new A();
    SoftRefenrence sr = new SoftReference(obj);
 
    引用时
    if(sr!=null){
        obj = sr.get();
    }else{
        obj = new A();
        sr = new SoftReference(obj);
    }

主要说明在Android里的用处:
在有需要缓存的地方。
在android编程中,特别是在listview用来显示来自网络的图片或者加载缩略图等需要异步加载的资源时,往往需要一个优化的机制。第一是异步加载。第二则是既要考虑到手机的内存问题,又要考虑到网络下载的问题,就是当你下载了一张图片,然后显示在listview的一个view上,然后执行往下拉又往回拉这个动作时,那么我们是否重新去下载该图片呢?好处是节省内存,你每次就存着显示在界面上的那几幅图,但是坏处是每次更新都要重新下载图片。所以我们需要一个缓存的机制,当只有图片的url(即图片的引用)不存在缓存中时才去下载。当然,当内存告急时,需要释放一些没引用的图片,这样,SoftReference就可以很大的用武之地了。即将下载下来的图片或者取出来的缩略图放在SoftReference中,然后用map,用Key=img_url来存储该软连接。

实际使用场景:
FileBrowser中的缩略图加载。
//pseudocode
private final static ConcurrentHashMap<String, SoftReference<Bitmap>> softBitmapCache;
private Bitmap getBitmap(String fileName) {
        // First try the hard reference cache
        SoftReference<Bitmap> bitmapReference = softBitmapCache.get(fileName);
        if (bitmapReference != null) {
            final Bitmap bitmap = bitmapReference.get();
            if (bitmap != null) {
                // Bitmap found in soft cache
                return bitmap;
            } else {
//then get from sdcard
                bitmap = getFromSDCard(fileName);
softBitmapCache.put(fileName, new SoftReference<Bitmap>(bitmap));
return bitmap;
            }
        }
     }

你可能感兴趣的:(java,android,ListView,cache,null,reference)