在recyclerView中显示位图时如何避免错误OOM

马赫迪·尼扎姆·帕斯特

我正在尝试在recyclerView的3列gridViewLayout中显示位图图像。但我收到OOM(内存不足)异常。

请注意,图像是从图库中选取的

我怎么解决这个问题 ??

这是我的onBindViewHolder:

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
    final byte[] data = arrayList.get(position).getAsByteArray("byteArray");

    Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

    Glide.with(activity)
            .load(bitmap)
            .apply(new RequestOptions().override(200, 200))
            .into(holder.image);
}

这是我的logCat的错误部分:

java.lang.OutOfMemoryError: Failed to allocate a 7680012 byte allocation with 4194208 free bytes and 6MB until OOM
    at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
    at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method)
    at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:564)
    at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:587)
    at com.apd.atxhider.allGalleryAdapter.onBindViewHolder(allGalleryAdapter.java:89)
    at com.apd.atxhider.allGalleryAdapter.onBindViewHolder(allGalleryAdapter.java:53)
    at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
    at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
    at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
    at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
    at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
    at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
    at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
    at androidx.recyclerview.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:561)
    at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
    at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
    at androidx.recyclerview.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:170)
    at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
    at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
    at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
    at android.view.View.layout(View.java:16001)
    at android.view.ViewGroup.layout(ViewGroup.java:5181)
    at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1855)
    at android.view.View.layout(View.java:16001)
    at android.view.ViewGroup.layout(ViewGroup.java:5181)
    at androidx.drawerlayout.widget.DrawerLayout.onLayout(DrawerLayout.java:1231)
    at android.view.View.layout(View.java:16001)
    at android.view.ViewGroup.layout(ViewGroup.java:5181)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:639)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:574)
    at android.view.View.layout(View.java:16001)
    at android.view.ViewGroup.layout(ViewGroup.java:5181)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:639)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:574)
    at android.view.View.layout(View.java:16001)
    at android.view.ViewGroup.layout(ViewGroup.java:5181)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:639)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:574)
    at android.view.View.layout(View.java:16001)
    at android.view.ViewGroup.layout(ViewGroup.java:5181)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1959)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1813)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1722)
    at android.view.View.layout(View.java:16001)
    at android.view.ViewGroup.layout(ViewGroup.java:5181)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:639)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:574)
    at android.view.View.layout(View.java:16001)
    at android.view.ViewGroup.layout(ViewGroup.java:5181)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2483)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2180)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1292)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6598)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:800)

谢谢你的帮助!

王丹

如果位图数据很大,则将导致encodeByteArray内存不足错误。因此,您需要直接使用Glide解码字节数组。

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
    final byte[] data = arrayList.get(position).getAsByteArray("byteArray");
   
    Glide.with(activity)
            .load(data)
            .apply(new RequestOptions().override(200, 200))
            .into(holder.image);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从巨大的表中检索所有记录时,如何避免OOM(内存不足)错误?

加载位图列表Android时发生OOM错误

在Android中单击RecyclerView时显示错误

在地图中间过滤> 0时如何避免显示错误

在recyclerview中使用位图时出现内存不足错误

在JAVA中添加分数时如何避免舍入错误

如何在更新记录时避免mysql中的此错误?

从R中的url下载数据时如何避免错误?

访问JavaScript数组中的元素时如何避免错误?

如何在TextView中显示动态位图?

如何在AndEngine中显示位图精灵?

避免在调用notifyItemChanged时RecyclerView显示滚动条

StorageItemThumbnail 中的位图在 GridView 中显示错误的尺寸

如何避免RecyclerView ViewHolder中的内存泄漏?

在 Tensorflow 中运行 LSTM 时出现 ResourceExhausted 错误或 OOM

在 Woocommerce 中显示评分平均值时避免 NAN 结果错误

当我想在设置器中更改道具时,“避免变异道具错误”显示

如何在显示ImageViews的ViewPager中更改显示的位图

使用PySpark以orc格式编写大型数据帧时,如何避免OOM问题?

从datagraidview获取null时如何避免错误

字典为空时如何避免错误?

多次包含时如何避免错误

如何避免Flutter中与api的连接错误?(断点类型显示在VS代码中)

在Recyclerview中如何在向上滚动时显示Snackbar,在向下滚动时如何退出

如何在使用渲染脚本模糊位图时避免黑色边框和发光?

如何修复RecyclerView OnClick间隙显示错误?

在 RecyclerView Adapter 中显示错误的日期

当密码在 Angularjs 中不匹配时如何显示错误消息?

Recyclerview滚动时如何从底部显示视图