onServiceDisconnected(崩溃或被oom杀死)

时间:2019-04-01 11:03:27

标签: android xamarin.android

我遇到onServiceDisconnected (crash or killed by oom)错误。该错误是随机发生的。我正在做的就是使用相机api2捕获图像并创建base64并使用glide加载它。图像数量没有限制,因此,如果用户单击约30张图像并使用glide加载图像,那么一段时间后,我会收到onServiceDisconnected (crash or killed by oom)错误。不知道错误在哪里发生。单击图片时,我还将image bytes放入字节数组。此字节数组稍后用于创建实际图像并将其保存在本地。

所以我不确定在哪里可能出现此错误。任何帮助将不胜感激。

编辑:

public class ImageAvailableListener : Java.Lang.Object, ImageReader.IOnImageAvailableListener
{
    public ImageAvailableListener(CameraFragment fragment, File file)
    {
        if (fragment == null)
            throw new System.ArgumentNullException("fragment");
        if (file == null)
            throw new System.ArgumentNullException("file");

        owner = fragment;
        this.file = owner.mFile;
    }

    private readonly File file;
    private readonly CameraFragment owner;

    public void OnImageAvailable(ImageReader reader)
    {
        owner.mBackgroundHandler.Post(new AddImageToList(reader.AcquireNextImage(), owner, owner.mFile));
    }

    private class AddImageToList : Java.Lang.Object, IRunnable
    {
        private CameraFragment fragment;
        // The JPEG image
        private Image mImage;

        private File mFile;
        public AddImageToList(Image image, CameraFragment _fragment, File file)
        {
            if (image == null)
                throw new System.ArgumentNullException("image");

            mImage = image;
            fragment = _fragment;
            mFile = file;
        }

        public void Run()
        {
            try
            {
                ByteBuffer buffer = mImage.GetPlanes()[0].Buffer;
                byte[] bytes = new byte[buffer.Remaining()];
                buffer.Get(bytes);
                string base64String = Convert.ToBase64String(bytes, 0, bytes.Length);
                string guid = Guid.NewGuid().ToString().ToUpper();
                fragment.capturedPics.Add(new keyValue { imageBytes = bytes, imageName = guid });
                fragment.capturedPicBase64.Add(new Data.Models.ViewModel.DocumentImageViewModel { imgName = string.Format("{0}", guid), base64 = base64String });
                mImage.Close();
            }
            catch (System.Exception e)
            {
                //e.PrintStackTrace();
            }
        }
    }
}

适配器

public class ViewDocumentAdapter : RecyclerView.Adapter
{
    #region Variable Declarations
    public List<object> _items;
    private readonly Activity _context;
    public event EventHandler<int> ItemClick;
    #endregion

    public ViewDocumentAdapter(Activity activity, IEnumerable<object> images)
    {
        _items = images.ToList();
        _context = activity;
    }

    void OnClick(int position)
    {
        if (ItemClick != null)
        {
            ItemClick(this, position);
        }
    }

    public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
    {
        View itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.imageThumbnailListItem, parent, false);
        DocumentViewHolder vh = new DocumentViewHolder(itemView, OnClick);
        return vh;
    }

    public override void OnViewRecycled(Java.Lang.Object holder)
    {
        DocumentViewHolder vh = holder as DocumentViewHolder;
        vh.imageView.SetImageDrawable(null);
        base.OnViewRecycled(holder);
    }

    public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
        DocumentViewHolder vh = holder as DocumentViewHolder;
       if (_items[position].ToString() == "default")
        {
            vh.cardView.SetCardBackgroundColor(new Color(ContextCompat.GetColor(_context, Resource.Color.darkGray)));
            vh.imageView.SetScaleType(ImageView.ScaleType.Center);
            vh.imageView.SetBackgroundColor(new Color(ContextCompat.GetColor(_context, Resource.Color.darkGray)));
            vh.progress.SetBackgroundColor(new Color(ContextCompat.GetColor(_context, Resource.Color.darkGray)));
            vh.frame.SetPadding(0, 0, 0, 0);

            DrawableTransitionOptions options = new DrawableTransitionOptions();
            options.CrossFade();
            Glide.With(vh.imageView.Context)//_context)
                        .Load(Resource.Drawable.CameraWhite)
                        .Apply(new Com.Bumptech.Glide.Request.RequestOptions()
                            .Error(Resource.Drawable.ic_exclaimation)
                            .FitCenter()
                            .Override(120, 120)
                            .InvokeDiskCacheStrategy(DiskCacheStrategy.All))
                        .Transition(options)
                        .Listener(new GlideImagelistener(vh))
                        //.Apply(RequestOptions.CircleCropTransform())
                        .Into(vh.imageView);
        }
        else
        {
            vh.cardView.SetCardBackgroundColor(new Color(ContextCompat.GetColor(_context, Resource.Color.backgroundColor)));
            vh.imageView.SetScaleType(ImageView.ScaleType.FitXy);
            vh.imageView.SetBackgroundColor(new Color(ContextCompat.GetColor(_context, Resource.Color.backgroundColor)));
            vh.progress.SetBackgroundColor(new Color(ContextCompat.GetColor(_context, Resource.Color.backgroundColor)));
            vh.frame.SetPadding(15, 15, 15, 15);

            DrawableTransitionOptions options = new DrawableTransitionOptions();
            options.CrossFade();
            Glide.With(vh.imageView.Context)//_context)
                        .Load(_items[position].ToString())
                        .Apply(new Com.Bumptech.Glide.Request.RequestOptions()
                            .Error(Resource.Drawable.ic_exclaimation)
                            .FitCenter()
                            .Override(120, 120)
                            .InvokeDiskCacheStrategy(DiskCacheStrategy.All))
                        .Transition(options)
                        .Listener(new GlideImagelistener(vh))
                        //.Apply(RequestOptions.CircleCropTransform())
                        .Into(vh.imageView);
        }
    }

    public int getSelectItem(int position)
    {
        return position;
    }
    public override int ItemCount
    {
        get { return _items.Count; }
    }

    public class DocumentViewHolder : RecyclerView.ViewHolder
    {
        public ImageView imageView { get; set; }
        public ProgressBar progress { get; set; }
        public FrameLayout frame { get; set; }
        public CardView cardView { get; set; }
        // Get references to the views defined in the CardView layout.
        public DocumentViewHolder(View itemView, Action<int> listener) : base(itemView)
        {
            imageView = itemView.FindViewById<ImageView>(Resource.Id.grid_item_image);
            progress = itemView.FindViewById<ProgressBar>(Resource.Id.progress);
            frame = itemView.FindViewById<FrameLayout>(Resource.Id.frame);
            cardView = itemView.FindViewById<CardView>(Resource.Id.cardView);
            itemView.Click += (sender, e) => listener(base.Position);
        }
    }
}

internal class GlideImagelistener : Java.Lang.Object,IRequestListener
{
    private DocumentViewHolder holder;

    public GlideImagelistener(DocumentViewHolder holder)
    {
        this.holder = holder;
        this.holder.progress.Visibility = ViewStates.Visible;
    }

    public bool OnLoadFailed(GlideException p0, Java.Lang.Object p1, ITarget p2, bool p3)
    {
        holder.progress.Visibility = ViewStates.Gone;
        return false;
    }

    public bool OnResourceReady(Java.Lang.Object p0, Java.Lang.Object p1, ITarget p2, DataSource p3, bool p4)
    {
        holder.progress.Visibility = ViewStates.Gone;
        return false;
    }
}

单击图像时,我将图像的base64以及字节保存在数组中。该图像尚未保存到移动存储中。允许用户查看单击的图像列表,并删除列表或向列表中添加更多图像(此列表是从base64数组加载的)。用户可以保存图像,这时,实际图像将在移动存储中创建并上传到服务器。将其同步到服务器后,用户可以返回并进行编辑。删除任何图像或添加更多图像。在这里,加载图像时它将来自服务器,即通过URL。新添加的图像将位于base64中。

不确定在哪里发生内存不足错误。

0 个答案:

没有答案