gpt4 book ai didi

java - 数据更改后停止将图像加载到 RecyclerView 适配器中的 ImageView 的所有线程的最佳方法

转载 作者:行者123 更新时间:2023-12-02 03:05:07 25 4
gpt4 key购买 nike

您好,我有 RecyclerView 适配器,我需要显示一个大列表(带有图像的不同列表)。我从单独的线程加载到 ImageView 中的所有图像。每个 ImageView 的每个线程。问题在于,当我更改适配器的数据并调用notifyDataSetChanged()时; - 有时,新的 ImageView 会显示先前数据集中的图像。我知道发生这种情况是因为 RecyclerView 正在重用 ViewHolder 项目 - 其中旧线程仍在下载旧图像,而不是新图像。所以我想知道当适配器中的数据集发生变化时如何停止所有线程。可能的方法是将所有线程放入一个数组中并在调用notifyDataSetChanged();之前停止所有线程?但我认为还有更优雅的解决方案吗?这是我的代码:

@Override
public void onBindViewHolder(ItemHolder holder, int position) {
........
holder.itemIcon.setImageResource(tree.getDefaultCover());

BitmapWorkerTask bitmapWorkerTask = new BitmapWorkerTask(holder.itemIcon, tree);
bitmapWorkerTask.execute(file);
......
}

然后在我的工作任务中,我在 postExecute 方法中设置位图

    @Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
mIconView.setImageBitmap(result);
}

最佳答案

使用AsycTask.execute,一次只有一个任务/线程处于 Activity 状态。当前一个完成时,下一个开始。在您的任务中,您必须至少在 doInBackground 的开头和 onPostExecute 的开头检查 isCanceled()

如果持有者知道任务并且任务知道持有者,您可以要求每个持有者停止其任务(调用取消方法)。

由于持有者和任务之间存在循环引用,因此存在内存泄漏的风险。

您必须确保一旦取消/完成或配置发生更改(即屏幕旋转),持有者就会忘记它的任务。

我已经在 APhotoManager 中完成了此操作。它包含 GalleryCursorFragment使用 gridview 和 GalleryCursorFragment带有嵌入的 GridCellViewHolder

关于java - 数据更改后停止将图像加载到 RecyclerView 适配器中的 ImageView 的所有线程的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41851799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com