zoukankan      html  css  js  c++  java
  • 关于解决Activity设置图片背景和ImageView设置帧动画引发的OOM的解决

    近期在工作中,由于Activity的背景图片均为1280 * 720大小的,引发了一系列的OOM问题。做了一些处理,心得如下:

    1.首先为什么会出现OOM呢。对于一张1280 * 720的图片,它应该占多大的内存呢?

    一张图片(bitmap)占用的内存大小大概等于图片的长度 * 图片的宽度(像素)* 单位像素所占用的字节数。而单位像素所占用的字节数,官网文档如下:

    -home-qspace-data-webmailcache-82-2612216199-ZL0211-kRb0QgNKbt1vmANXH~FGd51_Attach-165EAD24@0675EE5C.E249B254

    2.那么应该如何解决该问题呢?

    首先出现OOM的原因是相应的Activity使用完该背景图片后,并没有释放掉对该图片的引用,系统并不可以去回收该图片资源,因此首先想到了手动的在该 Activity销毁的时候setBackgroundResource为0(相当于remove掉该背景),但是后期发现这样做的效果并不明显,GC并没有及时的回收掉资源。又重新查资料,想到每次销毁的时候都去获取到背景的bitmap,手动的recycle一下。代码如下:

    -home-qspace-data-webmailcache-82-2612216199-ZL0211-kRb0QgNKbt1vmANXH~FGd51_Attach-72FEBAD6@0675EE5C.E249B254

    这样解决以后,OOM的问题得到了很大程度上的解决,但是同时又出现了另一个问题:

    -home-qspace-data-webmailcache-82-2612216199-ZL0211-kRb0QgNKbt1vmANXH~FGd51_Attach-DC84B19B@0675EE5C.E249B254

    那为什么出现该问题呢?
    3.为什么出现trying to use a recycled bitmap 的异常
    因为我们在recycle时有可能该Activity还在使用该背景图片,因此引起了该异常。那么应该如何解决呢,我的大概想法是,在recycle之前,先将Activity和背景图片的引用关系解开再去recycle图片。如下:

    -home-qspace-data-webmailcache-82-2612216199-ZL0211-kRb0QgNKbt1vmANXH~FGd51_Attach-7C4755CD@0675EE5C.E249B254

    大致可以解决掉以上问题。以上即为我解决掉这个bug的一些分享。大家如果有更好的解决办法,请告知我一声,谢啦。

    对于帧动画,解决方法类似,代码如下:

    QQ截图20150119172213

    如有错误。请及时指出,谢谢。

  • 相关阅读:
    Java annotation
    子类 父类强转 HttpServlet service实现
    父类 子类 强转
    HttpServlet Service方法
    java go
    IO写 PrintWriter
    IO读 BufferedReader+FileReader
    Java NIO-3
    心跳包(HeartBeat)
    Git学习笔记(一)
  • 原文地址:https://www.cnblogs.com/mandy920213/p/4234296.html
Copyright © 2011-2022 走看看