好问题 
非Bitmap图片过大过多导致的内存泄漏 的解决方案征集

解决方案 »

  1.   

    这段代码看不出哪里有内存泄露  你是在运行中发现内存一直在增加 直到OOM错误,还是一启动就报OOM错误了。
      

  2.   

    一开始运行的时候是没有问题的,但是在Gallery中点击几个图片后就出错了
    错误是:
    dalvikvm.3775488-byte external allocation too large for this process
    Graphics VM won't let us allocate 3775488 bytes我移走了几个大的图片,勉强可以运行,但是实际中这种情况是不行的啊
      

  3.   

    在博客园里遇到个大神,但只是告诉我可以用如下的方法
    写一个全局的资源管理类,用Map和软引用来保存这些图片资源,而不是直接引用资源文件
    不过说实话,我没有理解,你们谁明白,说下
      

  4.   

    点击时跟踪下内存变化System.out.println(Runtime.getRuntime().totalMemory());这个值运行中不会有多大变化那内存就没泄漏。这个只是你点击图片时候需要将资源转成位图显示申请不到内存了,8M有点小了一张大图转成位图都好几M了调试时候可以设置/system/build.prop这个文件的dalvik.vm.heapsize设大些。
      

  5.   

    上次遇到了这个问题,也是没搞定
    最后的解决办法是把美工压缩图片质量,而且不能用JPG的因为JPG本身就是压缩格式,用的时候会解码出来。
    还有就是,直接引用的时候,其实也是后台通过bitmap解码来的我水平有限,粗略猜测那位神人说的意思,就是不要直接写R.drawable.xxx这样的引用,直接写一个类,通过bitmap加载,然后自己管理资源的读取和释放。再给程序“引用”。但是我们上次这样试过,图片资源足够大的时候,这里是说单个图片过大,或者同时存在的图片过多,还是会出现这个问题,仍然解决不能
      

  6.   

    关注下 我一般也是用recyle的多些 
      

  7.   

    软引用是指java的SoftReference,android的源码中有很多地方使用了软应用,可以参考下。
      

  8.   

    就是因为Android中引入了C,才导致的内存泄露。JAVA那套虚拟机自动回收内存
      

  9.   

    Android也有虚拟机,也自动回收,和C没关系。本来手机资源就紧张,弄个虚拟机也就算了,还搞个内存无法控制。
    所谓的垃圾回收,和WC差不多,本来上完厕所顺手一冲就行了,自动回收呢,好处就是不用你自己冲了,有专家帮你照看着。其实本来是有道理的,在中国,大型公众场所厕所都比较脏,没人打扫真不行。但是如果每家都安排一个专职帮你冲厕所的,Java之父财大气粗,也不怕烦,每隔几秒问他一次:上完厕所没有,他喜欢这样。但是手机不喜欢,你丫的烦不烦,什么破马桶,我泄给你看看。
      

  10.   

    lz的代码有一点问题,传Context时要传ApplicationContext,而不要直接把Activity传进去。这样容易导致整个Activity泄露。
    建议lz看一下Android SDK文档resources\articles\avoiding-memory-leaks.html有时OOM不一定就是内存泄露,而可能是图片过大,在解码的时候,需要进行下采样。
      

  11.   


    一张图片3.7M,lz用的是多大的图片啊
    不要用R。drawable,用Bitmap。
    解码必须经过下采样,并将颜色空间设为RGB565。用完后必须及时recycle。有人说的Soft/Weak Reference有一定效果,但是这个是系统控制的,没有自己控制什么时候释放好。