首页 > 代码库 > 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  } 
View Code