Android位图操作、内存分配和垃圾收集
编辑: 问这个问题的目的是确定我是否理解Java中的内存分配和垃圾收集,而不是确定是否有更好的方法在Android中显示和旋转图像 我正在编写一个活动,让用户打开一个图像文件,旋转图像,裁剪图像,然后将结果旋转/裁剪图像保存到光盘 在解决这个问题时,我一直在密切关注分配的内存,我想知道我看到的行为是a)预期的还是b)表示编程错误 行为 1) 从库中选择图像。使用BitmapFactory从文件中解码图像,我创建了一个位图变量,然后将其显示在ImageView中。我注意到,当我这样做的时候,我的分配会增加一定数量。让我们假设1MB用于讨论 2) 用户希望将图像旋转90度。他们点击一个按钮,然后运行下面的代码来旋转位图Android位图操作、内存分配和垃圾收集,android,garbage-collection,android-bitmap,Android,Garbage Collection,Android Bitmap,编辑: 问这个问题的目的是确定我是否理解Java中的内存分配和垃圾收集,而不是确定是否有更好的方法在Android中显示和旋转图像 我正在编写一个活动,让用户打开一个图像文件,旋转图像,裁剪图像,然后将结果旋转/裁剪图像保存到光盘 在解决这个问题时,我一直在密切关注分配的内存,我想知道我看到的行为是a)预期的还是b)表示编程错误 行为 1) 从库中选择图像。使用BitmapFactory从文件中解码图像,我创建了一个位图变量,然后将其显示在ImageView中。我注意到,当我这样做的时候,我的分
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中。这个功能很好,但是如果我观察内存分配,我可以看到它又增加了1MB。这对我来说很有意义,因为我在内存中有原始位图,然后我在内存中创建了一个旋转90度的副本,所以我在内存中有两倍于原始位图大小
我注意到,在某些设备上,垃圾收集器似乎非常激进,只会非常短暂地允许2倍的内存分配,但几乎会立即导致GC,并将分配的内存降至1MB。然而,在其他设备上,我注意到2x内存分配不会立即导致GC。在这些设备上,如果我进行多次旋转,我可能会在GC发生之前获得3倍或4倍的分配内存
我的问题是,如果GC运行时,分配下降到其原始值,那么分配量是否会出现问题?换句话说,我是在这里造成某种内存泄漏,还是一切正常?当系统需要内存时,它执行GC,一切恢复正常
编辑:
我正在编写的应用程序适用于SDK版本15+(4.x及以上)此“其他设备”是否适用于android 2.3及更低版本?因为在旧设备上,位图使用“非托管”内存,您需要调用bitmap.recycle来释放它。@VolodymyrBaydalka查看我的编辑。此应用程序将在4.0及更高版本上运行。因此,不要创建其他位图,只需使用setImageMatrix