取消搜索时的 imageLoader 任务
Cancel imageLoader tasks on searching
我的项目有一个带有自定义适配器的搜索视图,
适配器 ViewHolder 包含 ImageView
我使用 2 个任务:1- 搜索任务 2- 图片加载任务
所以当我开始搜索任务时,在 Post 执行时我设置数据适配器并通知它
然后图像加载器执行与结果数量一样多!
当我重新运行搜索任务时,我应该等到图像加载器的任务完成
最后,如何在重新运行 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;
}
为了能够一次性取消所有 ImageLoader
,您必须在适配器中保留对它们的引用,并在适配器中声明一个 public全部取消它们的方法:
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()
在搜索前取消所有图像加载器
我的项目有一个带有自定义适配器的搜索视图, 适配器 ViewHolder 包含 ImageView
我使用 2 个任务:1- 搜索任务 2- 图片加载任务
所以当我开始搜索任务时,在 Post 执行时我设置数据适配器并通知它 然后图像加载器执行与结果数量一样多!
当我重新运行搜索任务时,我应该等到图像加载器的任务完成
最后,如何在重新运行 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;
}
为了能够一次性取消所有 ImageLoader
,您必须在适配器中保留对它们的引用,并在适配器中声明一个 public全部取消它们的方法:
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()