Android用listview加载完Bitmap后,Bitmap所占用的内存得不到及时的释放

 

本帖最后由 wind_wing 于 2011-1-20 16:05 编辑

在发这个帖子的时候,我把论坛上和网上搜了一遍,大部分都是加载图片的时候出现OOM的异常,解决的办法也多种多样,我现在在加载图片的时候倒是没出现OOM,但是用listview加载完图片后,bitmap所占用的内存没被及时的释放掉,导致在运行程序其他部分的时候,会出现OOM的错误。在listview中加载图片的代码如下


  1. public View getView(int position, View convertView, ViewGroup parent) {
  2.   ........................
  3.   Bitmap thumb = null;
  4.   try {
  5.    String codeString = items[position].getThumbnail();
  6.    if (codeString.length() > 0){
  7.     
  8.     byte[] imageDecoded = Base64Coder.decode(codeString);
  9.     
  10.     thumb = BitmapUtil.decodeimagebyte(imageDecoded) ;
  11.     
  12.     BitmpCache(position, thumb);
  13.     
  14.     ivIcon.setImageBitmap(thumb);
  15.     imageDecoded = null;
  16.     thumb = null;
  17.    }
  18.    else{
  19.     ivIcon.setImageDrawable(context.getResources().getDrawable(R.drawable.nullbmp));
  20.    }
  21.    
  22.   } catch (Exception e) {
  23.    e.printstack();
  24.   }
  25. .......................
  26. }
复制代码
图片加载是在getview中进行的,每次解析玩图片后,就把图片和position存在一个HashMap 的对象中,这个HashMap对象 BitmpCache仅仅用来存储,bitmap和item的键值,然后在按下Activity销毁的时候用来删除Bitmap对象的时候用到。

  1. private void BitmpCache(int position,Bitmap bitmap){
  2. if(!BitmapCache.containsKey(position)){
  3. BitmapCache.put(position, bitmap);
  4. }
  5. }
复制代码

BitmapUtil.decodeimagebyte(imageDecoded) 是自己封装的一个类,也就是常规的解析Bitmap图片的方法,

然后当图片列表显示完以后,按下返回键的时候释放用Bitmap保存的Bitmap对象,代码如下

  1. private void freeBitmap(HashMap<Integer, Bitmap> cache){
  2.   if(cache.isEmpty()){
  3.    return;
  4.   }
  5.   Log.e("freeBitmap", "cache size="+cache.size());
  6.   for(Bitmap bitmap:cache.values()){
  7.    if(!bitmap.isRecycled() && bitmap != null){
  8.     bitmap.recycle();
  9.   Log.e("freeBitmap", "=============recycle bitmap=======");
  10.    }

  11.       cache.clear();
  12. }
复制代码

当我每次按下返回键的时候,发现系统GC的objects 确实比以前多了,但是感觉有问题,当listvew加载了100多张图片后,GC的objects也有100多但是显示的大小只有6000多bytes,好像连一张图片的大小都没达到,感觉Bitmap的内存还在系统中没有得到及时的释放,结果当我用listview加载100多张图片的时候,然后再listview上多滑动几下,然后退出这个页面,进入其他的Activity 就会100%出现OOM的异常,不知有没有好的解决方法

你可能感兴趣的:(Android用listview加载完Bitmap后,Bitmap所占用的内存得不到及时的释放)