很多的时候,我们使用Bitmap不会出现多大的问题。但是当机器资源不够的情况下,很多应用都会报出 OutOfMemoryError,当然报出这样的异常往往是给Bitmap分配内存时内存不足引起的。即便是很小的一个图片,也会有出错,如何解决呢?

我的解决办法如下:

    public static Bitmap createBitmap(int width, int height, Bitmap.Config config) {          Bitmap bitmap = null;          try {              bitmap = Bitmap.createBitmap(width, height, config);          } catch (OutOfMemoryError e) {              while(bitmap == null) {                  System.gc();                  System.runFinalization();                  bitmap = createBitmap(width, height, config);              }          }      }  


经过最近不断的实验证明,当内存泄漏很大的时候,上述方法根本无法避免内存溢出。其实避免内存溢出还是要靠平时写代码的时候自己去注意。很多时候的溢出主要是因为Bitmap和Drawable资源没被释放造成的,尤其是当项目中图片资源很多的时候,这个问题尤为突出。

解决办法:当CreateBitmap之后,当这个Bitmap用完之后,那需要recycle这个资源。

还有当需要更换图片的背景资源的时候需要使用到Drawable,当需要更换那个Drawable时,原来的Drawable需要setCallback(null)

如:

Bitmap bm = BitmapFactory.decodeResource(this.getResources(),R.drawable.splash);
BitmapDrawable bd = new BitmapDrawable(this.getResources(),bm);

mBtn.setBackgroundDrawable(bd);

来代替mBtn.setBackgroundResource(R.drawable.splash)。

销毁的时候使用:

BitmapDrawable bd = (BitmapDrawable)mBtn.getBackground();

mBtn.setBackgroundResource(0);//别忘了把背景设为null,避免onDraw刷新背景时候出现used arecycled bitmap错误

bd.setCallback(null);
bd.getBitmap().recycle();

来使Activity对原来的资源解除引用,从而使资源得到释放。Java的内存管理不像C++一般,但是也有它的灵活之处,只要仔细想想,还是可以将内存管理好的。

如果你有更好的解决办法,可以一起讨论。



andriod 的bitmap 真是个大胖子,操作稍有不当,就会引发OutOfMemoryError

提供几种管理bitmap的方法,以便记录
1.加载多个bitmap时候即时调用recycle()释放资源
2.加载比较大的图片时使用 BitmapFactory.Options按比例缩放图片,即时调用recycle()释放资源
3.加载单独图片时尽可能的少生成bitmap对象,比如我的一个界面需显示一个图片(如果每次加载的图片不同),将bitmap对象用static修饰,每次加载该界面的时候先进行释放处理,然后在重新加载
if(bitmap!=null&&!bitmap.isRecycled()){
bitmap.recycle()
bitmap=null;
System.gc();
}
总之只要是涉及到bitmap的地方,做好释放的操作。
以上是本人在工程里管理bitmap的几种方法,不知道对你有木有用,我反正是用了

更多相关文章

  1. 手把手教你搭建 Android(安卓)SVN 环境
  2. 如何更改Android(安卓)程序的icon快捷方式图标?
  3. Android处理非res资源的例子
  4. android Java BASE64编码和解码一:基础
  5. 反射技术在android中的应用
  6. cocos2d-x 里获取 android apk icon
  7. android中几种常用的图片处理效果
  8. Android实现支持缩放平移图片
  9. Android资源管理中的Runtime Resources Overlay-------之overlay

随机推荐

  1. 用ldap作为django后端用户登录验证
  2. 记一次生产环境问题解决案例(k8s环境)
  3. ArrayList底层
  4. 苹果Mac强大的图床软件:​​​​PicGo
  5. 【东哥说书】俞军产品方法论
  6. Apache Flink 商业公司 Ververica 又有几
  7. 一文了解 Apache Hive 联邦查询(Query Fed
  8. 从行存储到 RCFile,Facebook 为什么要设计
  9. K8S进阶实践 之 ConfigMap配置文件挂载
  10. Prism:Uber 的 Presto 查询网关服务