我有一个应用程序需要从图库中加载大图像(2mb)几次并在imageview中显示。我想允许用户在选择后更改图像。所以他们可以回到之前的活动并再次选择。这在前两次工作正常,但是,第三次,它会因内存不足而崩溃。
[dalvikvm-heap] 32741392字节分配的内存不足。
[BitmapFactory]解码器JPEG解码失败!
[skia] --- decoder-> decode返回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()上添加一个位图回收,并希望释放此活动消耗的内存
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]为32741392字节增长堆(frag case)为37.557MB 分配
[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]为32741392字节分配将堆(frag case)增长到68.783MB
[skia] jpeg_decoder成功完成,L:1881 !!!
这是否意味着我为选择一张图片使用了太多内存?我应该调整位图大小还是释放内存?非常感谢你!
答案 0 :(得分:3)
你的形象很重要。您应该以较小的尺寸加载它,因为Bitmap
占用一个像素的4个字节。因此,500万像素将产生20MB的内存。
您需要加载位图的元数据,重新计算所需的样本大小,并请求该大小的位图。这可以使用Bitmap.Options
完成。在开发者指南中阅读所有相关内容。 http://developer.android.com/training/displaying-bitmaps/load-bitmap.html