在搜索时取消 imageLoader 任务

Posted

技术标签:

【中文标题】在搜索时取消 imageLoader 任务【英文标题】:Cancel imageLoader tasks on searching 【发布时间】:2017-12-07 21:51:03 【问题描述】:

我的项目有一个带有自定义适配器的搜索视图, 适配器 ViewHolder 包含 ImageView

我使用 2 个任务:1- 搜索任务 2- 图片加载任务

所以当我开始搜索任务时,在执行后我设置数据适配器并通知它 那么图像加载器的执行次数与结果的数量一样多!

当我重新运行搜索任务时,我应该等到图像加载器的任务完成

最后如何在重新运行 SearchTask 之前取消 ImageLoader 任务??

适配器:

@Override
public View getView(int position, View convertView, ViewGroup parent) 
    ViewHolder viewHolder;
    if (convertView == null) 
        viewHolder = new ViewHolder();
        LayoutInflater inflater = (LayoutInflater) activityReference.get().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.list_row1, parent, false);
        viewHolder.title = (TextView) convertView.findViewById(R.id.row_title);
        viewHolder.artist = (TextView) convertView.findViewById(R.id.row_artist);
        viewHolder.cover = (FadeInNetworkImageView) convertView.findViewById(R.id.cover);
        convertView.setTag(viewHolder);
     else
        viewHolder = (ViewHolder) convertView.getTag();

    viewHolder.title.setText(songs[position].getArtist());
    viewHolder.artist.setText(songs[position].getTitle());


    new ImageLoader().execute(songs[position], this, this, viewHolder, Online.isConnectedWifi(context));

    return convertView;

【问题讨论】:

我很困惑。当您要运行搜索任务时,您希望它等待图像加载器还是取消图像加载器? @Dziugas 我想取消图像加载器,因为再次运行搜索任务可能会完全改变结果!! 好吧,因为后来你说“当我重新运行搜索任务时,我应该等到图像加载器的任务完成”。 @Dziugas AsyncTasks 是轮流执行的,我的意思是搜索任务会在 imageloader 任务完成后运行 【参考方案1】:

为了能够一举取消所有ImageLoaders,你必须在你的适配器中保持对它们的引用,并在你的适配器中声明一个公共方法来取消它们:

public class MhadisAdapter extends SomeKindOfAdapter 
    private List<ImageLoader> imageLoaderTasks = new ArrayList<>();

    public void cancelImageLoaders() 
        for(ImageLoader task: imageLoaderTasks) 
            task.cancel(true);
        
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
        ...
        ...
        ImageLoader imageLoader = new ImageLoader();
        imageLoaderTasks.add(imageLoader);
        imageLoader.execute(songs[position], this, this, viewHolder, Online.isConnectedWifi(context));

        return convertView;
    

现在您可以通过调用cancelImageLoaders()在搜索之前取消所有图像加载器

【讨论】:

不!这是简单的方法。它工作得很好,谢谢;) 没问题。只需确保在 ImageLoader 中覆盖 onCanceled(),您应该在其中进行清理(关闭连接等)

以上是关于在搜索时取消 imageLoader 任务的主要内容,如果未能解决你的问题,请参考以下文章

.imageloader是啥文件

ImageLoader的使用

ImageLoader的使用

Image-Universal-Loader

android ImageLoader 混淆加载drawable出现黑色图片的解决方案

Android UI-开源框架ImageLoader的完美例子