我遇到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中。
不确定在哪里发生内存不足错误。