【问题标题】:Out of memory when select image from gallery for the third times Android第三次从图库中选择图像时内存不足Android
【发布时间】: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


    【解决方案1】:

    你的形象太大了。您应该以较小的尺寸加载它,因为Bitmap 占用一个像素的 4 个字节。所以一张 5MP 的图片,会占用 20MB 的内存。

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

    【讨论】:

      猜你喜欢
      • 2014-07-23
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多