Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android位图操作、内存分配和垃圾收集_Android_Garbage Collection_Android Bitmap - Fatal编程技术网

Android位图操作、内存分配和垃圾收集

Android位图操作、内存分配和垃圾收集,android,garbage-collection,android-bitmap,Android,Garbage Collection,Android Bitmap,编辑: 问这个问题的目的是确定我是否理解Java中的内存分配和垃圾收集,而不是确定是否有更好的方法在Android中显示和旋转图像 我正在编写一个活动,让用户打开一个图像文件,旋转图像,裁剪图像,然后将结果旋转/裁剪图像保存到光盘 在解决这个问题时,我一直在密切关注分配的内存,我想知道我看到的行为是a)预期的还是b)表示编程错误 行为 1) 从库中选择图像。使用BitmapFactory从文件中解码图像,我创建了一个位图变量,然后将其显示在ImageView中。我注意到,当我这样做的时候,我的分

编辑: 问这个问题的目的是确定我是否理解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中。这个功能很好,但是如果我观察内存分配,我可以看到它又增加了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