ava中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引用了
原文链接:
http://www.cnblogs.com/dolphin0520/p/3784171.html
经验分享:
到底什么时候使用软引用,什么时候使用弱引用呢?
个人认为,如果只是想避免OutOfMemory异常的发生,则可以使用软引用。如果对于应用的性能更在意,想尽快回收一些占用内存比较大的对象,则可以使用弱引用。
还有就是可以根据对象是否经常使用来判断。如果该对象可能会经常使用的,就尽量用软引用。如果该对象不被使用的可能性更大些,就可以用弱引用。
另外,和弱引用功能类似的是WeakHashMap。WeakHashMap对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的回收,回收以后,其条目从映射中有效地移除。WeakHashMap使用ReferenceQueue实现的这种机制。
加载图片使用软引用的实例:
1 /*** 2 * 异步加载图片 缓存的实现 3 * 4 * @author jia 5 * 6 */ 7 public class AsyncImageLoader { 8 // 软引用 9 private HashMap<String, SoftReference<Drawable>> imageCache; 10 11 public AsyncImageLoader() { 12 imageCache = new HashMap<String, SoftReference<Drawable>>(); 13 } 14 15 /*** 16 * 下载图片 17 * 18 * @param imageUrl 19 * 图片地址 20 * @param imageCallback 21 * 回调接口 22 * @return 23 */ 24 public Drawable loadDrawable(final String imageUrl, 25 final ImageCallback imageCallback) { 26 if (imageCache.containsKey(imageUrl)) { 27 SoftReference<Drawable> softReference = imageCache.get(imageUrl); 28 Drawable drawable = softReference.get(); 29 if (drawable != null) { 30 return drawable; 31 } 32 } 33 final Handler handler = new Handler() { 34 public void handleMessage(Message message) { 35 imageCallback.imageLoaded((Drawable) message.obj, imageUrl); 36 } 37 }; 38 // 开启线程下载图片 39 new Thread() { 40 @Override 41 public void run() { 42 Drawable drawable = loadImageFromUrl(imageUrl); 43 // 将下载的图片保存至缓存中 44 imageCache.put(imageUrl, new SoftReference<Drawable>(drawable)); 45 Message message = handler.obtainMessage(0, drawable); 46 handler.sendMessage(message); 47 } 48 }.start(); 49 return null; 50 } 51 52 /*** 53 * 根据URL下载图片(这里要进行判断,先去本地sd中查找,没有则根据URL下载,有则返回该drawable) 54 * 55 * @param url 56 * @return 57 */ 58 public static Drawable loadImageFromUrl(String imageURL) { 59 60 Bitmap bitmap = MyUtil.GetBitmap(imageURL, 100); 61 Drawable drawable = new BitmapDrawable(bitmap); 62 return drawable; 63 64 } 65 66 // 回调接口 67 public interface ImageCallback { 68 public void imageLoaded(Drawable imageDrawable, String imageUrl); 69 } 70 71 }