zoukankan      html  css  js  c++  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 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  } 
    View Code
  • 相关阅读:
    好好学习天天向上之InfoPath学习系列(一):Form Services与InfoPath初识
    Windows Server 2008 R2 AD RMS管理(转)
    好好学习天天向上之InfoPath学习系列(零):写在最前面
    如何向妻子解释OOD(转)
    WCF下传递EF实体对象中出现异常:无法将 EntityReference 对象序列化
    生产信息集成分析平台(MIIAS V1.0) 概述
    Hadoop:分布式计算平台初探
    Junit单元测试配置及基本用法
    centos7安装maven
    docker安装redis
  • 原文地址:https://www.cnblogs.com/yujian-bcq/p/3791360.html
Copyright © 2011-2022 走看看