java 强弱引用

 

     ava中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引用了

原文链接:

http://www.cnblogs.com/dolphin0520/p/3784171.html

 

经验分享:

到底什么时候使用软引用,什么时候使用弱引用呢?

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

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

另外,和弱引用功能类似的是WeakHashMap。WeakHashMap对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的回收,回收以后,其条目从映射中有效地移除。WeakHashMap使用ReferenceQueue实现的这种机制。

 

加载图片使用软引用的实例:

 

java 强弱引用
 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

 

 

 

 

java 强弱引用,布布扣,bubuko.com

java 强弱引用

上一篇:基于java实现的简单网页日历功能,有兴趣得可以把它转换到前端实现


下一篇:【Android快速入门】目录结构及adb命令【附Android拨号器的实现,自作】