文档章节

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

峰易
 峰易
发布于 2015/02/07 16:40
字数 575
阅读 114
收藏 0

 

本帖最后由 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的异常,不知有没有好的解决方法

© 著作权归作者所有

峰易
粉丝 1
博文 16
码字总数 13133
作品 0
杭州
程序员
私信 提问
Android的内存泄漏和调试

Android的内存泄漏和调试 一、 Android的内存机制 Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似。程序员通过new为对象分配内存,所有对象在java堆内分配空间;然...

JasonZhao
2013/02/18
606
1
Android的内存泄漏和调试

一、 Android的内存机制 Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似。程序员通过new为对象分配内存,所有对象在java堆内分配空间;然而对象的释放是由垃圾回收...

crystaltiger
2013/08/05
544
0
android应用开发 网络编程与常见功能优化总结

一般的应用都是从服务器获取数据,然后通过极致的界面风格,将数据清晰,明朗的展现给用户。、 那么就可以分为这两块: 1.界面UI 追求极致 2.功能 2.1获取数据:主要是与服务器通信,那么就要...

补全
2013/04/07
585
1
Android开发优化之——对Bitmap的内存优化

在Android应用里,最耗费内存的就是图片资源。而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常。所以,对于图片的内存优...

KingMing
2015/04/03
97
0
[Android] Android开发优化之——对Bitmap的内存优化

在Android应用里,最耗费内存的就是图片资源。而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常。所以,对于图片的内存优...

haman
2014/01/25
988
1

没有更多内容

加载失败,请刷新页面

加载更多

sync 包讲解

sync.Once Once 的作用是多次调用但只执行一次,Once 只有一个方法,Once.Do(),向 Do 传入一个函数,这个函数在第一次执行 Once.Do() 的时候会被调用,以后再执行 Once.Do() 将没有任何动作...

李琼涛
17分钟前
3
0
java中的byte占一字节或4字节

https://www.jianshu.com/p/2f663dc820d0

南桥北木
31分钟前
3
0
Cassandra 常用命令

Linux控制台命令 #进入Cassandra的安装目录 cd /home/db/cassandra/cassandra #进入Cassandra 无密码 ./bin/cqlsh localhost(IP)有密码 ./bin/cqlsh localhost(IP)-u 用户名 #显示所...

最菜最菜之小菜鸟
36分钟前
4
0
自建redis笔记

自建redis笔记 最近在linux安装了一下redis,特做一些笔记! 本文先单节点启动redis,然后再进行持久化配置,在次基础上,再分享搭建主从模式的配置以及Sentinel 哨兵模式及集群的搭建 单节点...

北极之北
44分钟前
3
0
扛住阿里双十一高并发流量,Sentinel是怎么做到的?

Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景 本文介绍阿里开源限流熔断方案Sentinel功能、原理、架构、快速入门以及相关框架比较 基本介绍 1 名词解释 服务限流 :当系统资源...

分布式系统架构
51分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部