我有一个应用程序需要从图库中多次加载大图像(2mb)并在 ImageView 中显示。我想允许用户在选择后更改图像。这样他们就可以返回之前的 Activity 并再次选择。前两次效果很好,但是第三次时,它会因内存不足而崩溃。
[dalvikvm-heap] 32741392 字节分配内存不足。
[BitmapFactory]解码器JPEG解码失败!
[skia] --- 解码器->解码返回 false
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
if ((requestCode == PickImageId) && (resultCode == Result.Ok) && (data != null))
{
uri = data.Data;
_paintView.SetImageURI (uri);
string path = GetPathToImage (uri);
Toast.MakeText (this, path, ToastLength.Long);
}
if (uri != null) {
//at the third time crush at this line
_paintView._Bmp= Android.Provider.MediaStore.Images.Media.GetBitmap(this.ContentResolver, uri);
_paintView._Bmp= _paintView._Bmp.Copy(Android.Graphics.Bitmap.Config.Argb8888, true);
_paintView._Bmp=Bitmap.CreateScaledBitmap(_paintView._Bmp, _paintView.w, _paintView.h, false);
_paintView._Canvas = new Canvas(_paintView._Bmp);
_paintView.SetImageBitmap (_paintView._Bmp);
uri.Dispose ();
_paintView2.SetImageBitmap (null);
_bitmap = _paintView._Bmp;
}
}
因此,我在 OnBackPressed() 处添加了位图回收,并希望释放此 Activity 消耗的内存
public override void OnBackPressed ()
{
base.OnBackPressed();
//_paintView._Bmp and _paintView2._Bmp contain the bitmap I use
if (_paintView._Bmp != null) {
_paintView._Bmp.Recycle ();
_paintView._Bmp = null;
}
if (_paintView2._Bmp != null) {
_paintView2._Bmp.Recycle ();
_paintView2._Bmp = null;
}
base.OnDestroy ();
StartActivity(new Intent(this, typeof(MainActivity)));
Finish();
}
但是,还是不行。我只是基本上不想调整位图的大小,因为我会做一些图像处理工作,而低质量会使其看起来很糟糕。那么使用后如何释放内存呢?
第一次成功加载
[skia] jpeg_decoder 模式 1,配置 6,w 3504,h 2336,样本 1,bsLength 0!!
[dalvikvm-heap] 将堆( fragment 情况)增长到 37.557MB,达到 32741392 字节 分配
[skia] jpeg_decoder 成功完成,L:1881!!!
[ManageCursor] ManagedQuery,c=1108461336
[管理光标] startManagingCursor, c=1108461336
[skia] jpeg_decoder 模式 1,配置 6,w 3504,h 2336,样本 1,bsLength 0!!
[dalvikvm-heap] 将堆( fragment 情况)增长到 68.783MB,分配 32741392 字节
[skia] jpeg_decoder 成功完成,L:1881!!!
这是否意味着我选择一张图像使用了太多内存?我应该调整位图大小还是释放内存?非常感谢!
最佳答案
你的图片太大了。您应该以较小的尺寸加载它,因为 Bitmap
一个像素占用 4 个字节。因此,一张 5MP 的图像将需要 20MB 的内存。
您需要加载位图的元数据,重新计算所需的样本大小,并请求该大小的位图。这可以通过 Bitmap.Options 来完成。请阅读开发者指南中的所有相关内容。 http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
关于java - Android 第三次从图库中选择图像时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30040807/