Android位图操作,内存分配和垃圾回收

时间:2015-05-19 14:53:41

标签: android garbage-collection android-bitmap

修改 提出这个问题的目的是确定我是否理解Java中的内存分配和垃圾收集,而不是是否有更好的方法在Android中显示和旋转图像。

我正在编写一个活动,允许用户打开图像文件,旋转图像,裁剪图像,然后将生成的旋转/裁剪图像保存到光盘。

在解决这个问题时,我一直密切关注已分配的内存,并且想知道我所看到的行为是否是a)预期或b)指示编程错误。

行为

1)从图库中选择图像。使用BitmapFactory从文件中解码图像,然后创建一个位图变量,然后在ImageView中显示该变量。我注意到,当我这样做时,我的分配会跳跃一定量。让我们说1MB进行讨论。

2)用户想要将图像旋转90度。他们点击一个按钮,然后运行以下代码来旋转位图。

    Matrix matrix = new Matrix();
    matrix.postRotate(90.0);
    this.mBitmap = Bitmap.createBitmap(this.mBitmap, 0, 0, this.mBitmap.getWidth(), this.mBitmap.getHeight(), matrix, true);

此代码获取现有的位图变量并对其应用旋转,然后再将其显示在ImageView中。这个功能很好,但是如果我观察内存分配,我可以看到它又跳了1 MB。这对我来说很有意义,因为我在内存中有原始位图,然后我创建了一个在内存中旋转90度的副本,所以我在内存中的原始位图大小是2倍。

我注意到在某些设备上,垃圾收集器看起来非常具有攻击性,并且只会非常短暂地允许这个2x内存分配,但几乎会立即导致GC并将分配的内存降至1MB。但是,在其他设备上,我注意到2x内存分配不会立即导致GC。在那些设备上,如果我进行多次旋转,我可能会在GC发生之前获得3x或4x的已分配内存。

我的问题是,如果在GC运行时分配量下降到原始值,那么分配量是否会出现问题?换句话说,我是在这里创建某种内存泄漏,还是表现得如此,当系统需要内存时,它会执行GC并且一切都恢复正常?

修改 我正在编写的应用程序适用于SDK版本15+(4.x及更高版本)

0 个答案:

没有答案