Android中弱引用与软引用的应用场景

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/johnWcheung/article/details/72861253
  1. SoftReference:软引用–>当虚拟机内存不足时,将会回收它指向的对象;需要获取对象时,可以调用get方法。

  2. WeakReference:弱引用–>随时可能会被垃圾回收器回收,不一定要等到虚拟机内存不足时才强制回收。要获取对象时,同样可以调用get方法。

  3. WeakReference一般用来防止内存泄漏,要保证内存被虚拟机回收,SoftReference多用作来实现缓存机制(cache)。

  4. 如果一个对象只具有软引用,那就类似于可有可无的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存,比如在图片加载框架中,通过弱引用来实现内存缓存。

  5. 只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。 Handler 弱引用,防止内存泄漏。

android有关图片软引用问题。

04-18

package com.nenglong.jxpt.client.util;rnrnimport java.io.File;rnimport java.io.InputStream;rnimport java.lang.ref.SoftReference;rnimport java.net.URL;rnimport java.util.HashMap;rnrnimport com.nenglong.jxpt.client.util.io.URLConnectionDownloader;rnrnimport android.app.Activity;rnimport android.graphics.Bitmap;rnimport android.graphics.BitmapFactory;rnimport android.util.Log;rnpublic class ImageLoad rnrn private HashMap> imageCache;rn private Activity activity;rnrn public ImageLoad(Activity activity1) rn imageCache = new HashMap>();rn activity = activity1;rn rnrn public static String getCachePath(Activity activity) rn File fileDir = activity.getCacheDir();rn return fileDir.getParent();rn rnrn /**rn * 异步下载图片rn * rn * @param imageUrlrn * 图片pathrn * @param imageCallbackrn * 回调函数rn * @returnrn */rn public Bitmap loadBitmap(final String imageUrl,int height) rn Bitmap bitmap=null;rn if (imageCache.containsKey(imageUrl))rn rnrn SoftReference softReference = imageCache.get(imageUrl); rn bitmap=softReference.get(); rn//这里为啥imageCache里面有这个地址imageUrl,但是返回的bitmap还是为空??????请问请教高手!rn if (bitmap != null) rn return bitmap; rn rn elsern rn rn try rn String cachePath = getCachePath(activity);rn String[] arr = imageUrl.split("\\/");rn String fileName = Md5.toMd5(imageUrl);rn String end = imageUrl.substring(imageUrl.lastIndexOf(".") + 1, imageUrl.length())rn .toLowerCase();rn File destDir = new File(cachePath + File.separator + "temp");rn if (!destDir.exists()) rn destDir.mkdirs();rn rn final String savePath = cachePath + File.separator + "temp"rn + File.separator + fileName + "." + end;rn File file = new File(savePath);rn if (file.exists() == false) rn /* new Thread() rn @Override rn public void run() rn try */rn URLConnectionDownloader.download(imageUrl, savePath);rn /* catch (Exception e) rn // TODO Auto-generated catch blockrn e.printStackTrace();rn rn rn .start(); */rn rn BitmapFactory.Options options = new BitmapFactory.Options();rn options.inJustDecodeBounds = true;rn bitmap = BitmapFactory.decodeFile(savePath, options); // 此时返回bm为空rn options.inJustDecodeBounds = false;rn if(height == -1)rn rn // 计算缩放比rn int be = (int) (options.outHeight / (float) 100);rn if (be <= 0)rn be = 1;rn options.inSampleSize = 1;rn rn elsern options.inSampleSize = 2;rn rn bitmap = BitmapFactory.decodeFile(savePath, options);rn imageCache.put(imageUrl, new SoftReference(bitmap)); rn if (bitmap != null && bitmap.isRecycled())rn bitmap.recycle();rn bitmap = null; // recycle()是个比较漫长的过程,设为null,然后在最后调用System.gc(),效果能好很多rn rn rn catch (Exception e) rn // TODO: handle exceptionrn Log.e("error", e.getMessage(), e);rn //bitmap.recycle();rn System.gc();rn return null;rn rn rn //System.gc();rn return bitmap; rn rnrn /**rn * 下载图片方法rn * rn * @param urlrn * 下载路径rn * @return Drawablern */rn public static Bitmap loadImageFromUrl(String url) rn URL m;rn InputStream i = null;rn try rn m = new URL(url);rn i = (InputStream) m.getContent();rn catch (Exception e) rn e.printStackTrace();rn rn Bitmap d = BitmapFactory.decodeStream(i);rn return d;rn rnrnrnrnrnrn这是个有关处理图片大量加载的工具类,虽然进行了软引用但是还是会报04-18 11:25:57.802: E/AndroidRuntime(545): java.lang.OutOfMemoryError: bitmap size exceeds VM budgetrn这样的错误,请教路过的高手该这样解决这个问题。给些参考资料代码。

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试