【发布时间】:2015-05-04 22:05:26
【问题描述】:
我有一个应用需要从画廊加载大图像 (2mb) 数次并在图像视图中显示。我想允许用户在选择后更改图像。这样他们就可以回到以前的活动并再次选择。这在前两次运行良好,但是在第三次时,它会因为内存不足而崩溃。
[dalvikvm-heap] 32741392 字节分配内存不足。
[BitmapFactory]解码器JPEG解码失败!
[skia] --- 解码器->解码返回假
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() 处添加了位图回收,并希望释放此活动消耗的内存
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 mode 1, config 6, w 3504, h 2336, sample 1, bsLength 0!!
[dalvikvm-heap] 将堆(碎片情况)增加到 37.557MB 以获得 32741392 字节 分配
[skia] jpeg_decoder 成功完成,L:1881!!!
[ManageCursor] managedQuery, c=1108461336
[ManageCursor] startManagingCursor, c=1108461336
[skia] jpeg_decoder mode 1, config 6, w 3504, h 2336, sample 1, bsLength 0!!
[dalvikvm-heap] 将堆(碎片情况)增加到 68.783MB 以分配 32741392 字节
[skia] jpeg_decoder 成功完成,L:1881!!!
这是否意味着我使用太多内存来选择一张图片?我应该调整位图大小还是释放内存?非常感谢!
【问题讨论】:
标签: java c# android memory xamarin