Search code examples
androidlistviewandroid-asynctaskandroid-adapterandroid-search

Cancel imageLoader tasks on searching


My project has a search view with custom adapter, adapter ViewHolder contain ImageView

I use 2 tasks: 1- search task 2- image load task

so when I start search task, on Post Execute I set data adapter and notif it then image loader is execute as much as the number of results!

When I rerun the search task,I Should wait until the tasks of the image loader are finished

Finally how can I cancel ImageLoader tasks before rerun SearchTask??

adapter:

@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;
}

Solution

  • In order to be able to cancel all the ImageLoaders in one swoop, you are going to have to keep reference to them in your adapter and, in your adapter, declare a public method that shall cancel them all:

    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;
        }
    }
    

    Now you can cancel all the image loaders before searching by calling cancelImageLoaders()