多个FAST屏幕旋转上的位图/ LayerDrawable泄漏

时间:2013-03-17 14:47:59

标签: android bitmap screen orientation memory-leaks

我在互联网上阅读了很多关于屏幕旋转时位图和内存泄漏的帖子和评论。

实际上,我遇到的问题非常特别......

我使用Eclipse DDMS,我正在观察由1个字节数组占用的堆内存,这与我放置在四个ImageView中的位图相关,每个位图都位于ViewFlipper的页面中。 图像是从内部存储器加载的,大到216-220KB,我使用一个可绘制的图层,以便在它们上面绘制另一个透明图像。

密切关注位图占用的堆内存,如果我改变设备的方向,内存会增加几MB。导致2-3 GC,在一瞬间内存量减少到初始值。 慢慢重复该过程(更改方向+ 2-3强制垃圾收集),内存量增加但然后返回相同的值。 这让我觉得我在我的应用程序中使用Bitmap管理正确。

但是如果我开始反复快速地旋转设备,我会看到内存量不断增加......随后的GC只能通过少量内存减少堆占用量与快速增长相比在快速旋转期间。

Android无法快速收集垃圾吗? 如果我慢慢旋转,为什么我能够保持内存使用稳定,而如果我反复旋转则不能 更快,而不强迫GC一段时间?

Android 4.1.2 /三星Galaxy S3。

只要从内部存储器读取png或从中下载png,就会调用以下代码 来自互联网的AsyncTask。 禁用AsyncTasks(因此通过后续轮换排除挂起的任务)不会 改变场景,就足以从内部存储加载两个“层”了 启动以在旋转设备时快速填充堆。

public void setBitmap(Bitmap bitmap) 
{
    try{
        Drawable layers[] = new Drawable[2];
        Bitmap fvgBackgroundBmp = BitmapFactory.decodeResource(getResources(), R.drawable.fvg_background2);
        layers[0] = new BitmapDrawable(getResources(), fvgBackgroundBmp);
        layers[1] = new BitmapDrawable(getResources(), bitmap);
        LayerDrawable layerDrawable = new LayerDrawable(layers);
        setImageDrawable(layerDrawable);
        mLayerDrawableAvailable = true;
    }
    catch(Exception outOfMemory)
    {
        Log.e("setBitmap got exception", outOfMemory.getLocalizedMessage());
    }
}

unbindDrawables()的{​​{1}}调用的方法Activity无效:

onDestroy()

2 个答案:

答案 0 :(得分:0)

当内存压力很高时,不保证会调用

onDestroy。这可以解释一下。尝试从onStop()

调用unbindDrawables

http://developer.android.com/training/basics/activity-lifecycle/stopping.html#Stop

答案 1 :(得分:0)

我会尝试从您的图层中取回可绘制的位图并将其回收。

public void unbindDrawables()
{
    if(mLayerDrawableAvailable)
    {
        LayerDrawable lDrawable = (LayerDrawable) getDrawable();
        if(lDrawable != null)
        {   
            ((BitmapDrawable)lDrawable.getDrawable(1)).getBitmap().recycle();
            ((BitmapDrawable)lDrawable.getDrawable(0)).getBitmap().recycle();
            lDrawable.setCallback(null);
        }
    }
}

尝试在您的活动中的onDestroy()事件的主体中调用unbindDrawables()。