修改 提出这个问题的目的是确定我是否理解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及更高版本)