首页 > 代码库 > java 强弱引用
java 强弱引用
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 imageUrl19 * 图片地址20 * @param imageCallback21 * 回调接口22 * @return23 */ 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 url56 * @return57 */ 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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。