java对引用的分类

来源:互联网 发布:php 搭建企业网站 编辑:程序博客网 时间:2024/06/03 16:56

Java对引用的分类有 Strong reference, SoftReference, WeakReference, PhatomReference 四种。
这里写图片描述
在Android应用的开发中,为了防止内存溢出,在处理一些占用内存大而且声明周期较长的对象时候,可以尽量应用软引用和弱引用技术。

软/弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。利用这个队列可以得知被回收的软/弱引用的对象列表,从而为缓冲器清除已失效的软/弱引用。

假设我们的应用会用到大量的默认图片,比如应用中有默认的头像,默认游戏图标等等,这些图片很多地方会用到。如果每次都去读取图片,由于读取文件需要硬件操作,速度较慢,会导致性能较低。所以我们考虑将图片缓存起来,需要的时候直接从内存中读取。但是,由于图片占用内存空间比较大,缓存很多图片需要很多的内存,就可能比较容易发生OutOfMemory异常。这时,我们可以考虑使用软/弱引用技术来避免这个问题发生。以下就是高速缓冲器的雏形:

首先定义一个HashMap,保存软引用对象。

private Map <String, SoftReference<Bitmap>> imageCache = new HashMap <String, SoftReference<Bitmap>> ();
  • 1

再来定义一个方法,保存Bitmap的软引用到HashMap。

public class CacheBySoftRef {    //首先定义一个HashMap,保存软引用对象    private Map<String,SoftReference<Bitmap>> imageCache=new HashMap<>();    /**     * 再来定义一个方法,保存Bitmap的软引用到HashMap     */    public void addBitmapToCache(String path){        //强引用的Bitmap对象        Bitmap bitmap= BitmapFactory.decodeFile(path);        //软引用的Bitmap对象        SoftReference<Bitmap> softBitmap=new SoftReference<Bitmap>(bitmap);        //添加该对象到Map中使其缓存        imageCache.put(path,softBitmap);    }    /**     * 获取的时候,可以通过SoftReference的get()方法得到Bitmap对象     * @param path     * @return     */    public Bitmap getBitmapByPath(String path){        //从缓存中取软引用的Bitmap对象        SoftReference<Bitmap> softBitmap=imageCache.get(path);        //判断是否存在软引用        if (softBitmap==null){            return null;        }        //通过软引用取出Bitmap对象,如果由于内存不足Bitmap被回收,将返回null,        // 如果未被回收,则可以重复使用,提高速度        Bitmap bitmap=softBitmap.get();        return bitmap;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

使用软引用以后,在OutOfMemory异常发生之前,这些缓存的图片资源的内存空间可以被释放掉的,从而避免内存达到上限,避免Crash发生。

如果只是想避免OutOfMemory异常的发生,则可以使用软引用。如果对于应用的性能更在意,想尽快回收一些占用内存比较大的对象,则可以使用弱引用。

另外可以根据对象是否经常使用来判断选择软引用还是弱引用。如果该对象可能会经常使用的,就尽量用软引用。如果该对象不被使用的可能性更大些,就可以用弱引用。

原创粉丝点击