Android第三次从图库中选择图片时出现内存不足

时间:2015-05-04 22:05:27

标签: java c# android memory xamarin

我有一个应用程序需要从图库中加载大图像(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 !!!

这是否意味着我为选择一张图片使用了太多内存?我应该调整位图大小还是释放内存?非常感谢你!

1 个答案:

答案 0 :(得分:3)

你的形象很重要。您应该以较小的尺寸加载它,因为Bitmap占用一个像素的4个字节。因此,500万像素将产生20MB的内存。

您需要加载位图的元数据,重新计算所需的样本大小,并请求该大小的位图。这可以使用Bitmap.Options完成。在开发者指南中阅读所有相关内容。 http://developer.android.com/training/displaying-bitmaps/load-bitmap.html