java - Android 第三次从图库中选择图像时内存不足

标签 java c# android memory xamarin

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

相关文章:

c# - 通过代码设置图形中的字体大小

c# - Windows 应用商店 WebView 替代方案

c# - 从矩阵的每一行和每一列中选择一个元素,求和最小化

java - 按钮在Click中不起作用

java - 登录后触发欢迎屏幕 2-3 秒

java - 连接流时意外关闭流

java - 一种有效的分位数算法/数据结构,允许样本随着时间的推移而增加?

android - 将支持库更新到 23.2.0 后 TabLayout 崩溃

java - ReSTLet 添加自定义解码器

java - netbeans 数据库检索数据并将其显示在另一个 jframe 文本字段中