画布:尝试使用回收的位图错误

2024-05-16

我是一个相当新的程序员,所以任何建议将不胜感激。我有一个类,每次调用它时都会在循环中运行 AsyncTask。 AsyncTask 看起来像这样:

public class LoadImageTask extends AsyncTask<Void, Void, Void> {

    Context c;
    ViewHolder vh;
    public Bitmap bm;
    ViewGroup container;
    LinearLayout layout;

    public LoadImageTask(Context c, ViewHolder vh, ViewGroup container, 
    LinearLayout linlay) {

        this.vh = vh;
        this.c = c;
        this.container = container;
        this.layout = linlay;
    }

    protected Void doInBackground(Void... params) {
        Tools tools = new Tools();
        this.bm = tools.getAlbumart(this.c, vh.albumID);
        return null;
    }

    protected void onPostExecute(Void param) {
        vh.iv.setImageBitmap(this.bm);
        this.layout.addView(this.container);
        if (bm!=null) {
            bm.recycle();
        }

    }
}

视图保持器 vh- 包含 2 个文本视图和一个图像视图的类

ViewGroup容器- 用于膨胀我所做的 xml 设计的容器(带有 2 个文本视图和一个 ImageView)

LinearLayout 林莱- 我将容器添加到的滚动视图布局(根据我想要在该视图中添加的元素数量来扩展它)

我创建的位图使用了太多内存,所以我想回收它们,但是每次我在将容器添加到布局后尝试回收它们时,它都会说我正在尝试使用回收的位图(当我'我在将容器添加到屏幕后清楚地调用了回收)...我在这一点上被难住了。你能帮忙的话,我会很高兴。


目前,您正在回收位图,然后再将其渲染到 UI 上,因为setImageBitmap(bm)只会准备 ImageView 来渲染提供的位图。渲染将安排在 UI 的下一次失效时。

bm.recycle()在渲染位图之前被调用,因此应用程序在尝试绘制位图时会崩溃。

在 UI 中使用位图时不能回收它,位图必须保留在内存中。在大多数情况下,Android 会很好地处理回收,但如果您需要自己回收,则需要确保之后不要使用 Bitmap 实例(就像在这种情况下,Bitmap 实例稍后将被渲染)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

画布:尝试使用回收的位图错误 的相关文章

随机推荐