当 RecyclerView 滚动时从 ThreadPool 杀死 运行 个线程

Kill Running Threads from ThreadPool When the RecyclerView Scrolls

我有 ThreadPool 从远程 url 获取视频缩略图。我在 RecyclerView 中显示此缩略图,ThreadPool 按预期工作。我从 RecyclerView AdapteronBindViewHolder 开始这项任务。问题是,假设如果我有 100 个任务,并且向下滚动到第 100 个项目(最后一个),那么线程必须等到必须处理第 99 个。所以我需要的是当用户滚动时我必须取消不需要在屏幕上显示的其他任务,并且应该开始新任务。我该怎么做,我们将不胜感激。

线程池class

public static VideoThumbnailThreadPoolManager getInstance() {

public void downloadThumbnail(String url, DownloadCompleteListener listener) {
        mExecutor.execute(new ImageDownloaderThread(url, listener));
  }


 private class ImageDownloaderThread extends Thread {
        String mUrl;
        DownloadCompleteListener mListener;

        ImageDownloaderThread(String url, DownloadCompleteListener listener) {
            setName(url);
            mUrl = url;
            mListener = listener;
        }

        @Override
        public void run() {
            try {
                Bitmap thumbnail = GeneralUtils.retriveVideoFrameFromVideo(mUrl);
                if (mListener != null) {
                    mListener.onThumbnailDownloaded(thumbnail);
                }
            } catch (Throwable throwable) {
                throwable.printStackTrace();

                if (mListener != null) {
                    mListener.onThumbnailDownloaded(null);
                }
            }
        }
    }

public void killThreadBy(String name) {
    //Give you set of Threads
    Set<Thread> setOfThread = Thread.getAllStackTraces().keySet();

    //Iterate over set to find yours
    for (Thread thread : setOfThread) {
        if (thread.getName().equals(name)) {
            thread.interrupt();
        }
    }
}

}

编辑

我没有得到缩略图 url,我正在通过拍摄视频的第一帧来生成缩略图。

NB

不推荐 Picasso、Glide...,因为它无法从远程视频加载缩略图 url。

我得到了答案。

我在 onViewRecycled() 方法调用时删除任务,

     @Override
     public void onViewRecycled(RecyclerView.ViewHolder holder) {
      if (holder instanceof MyViewHolder) {
                MyViewHolder viewHolder = (MyViewHolder) holder;
        String threadName = holder.itemView.getTag();

        if(notEmpty(threadName)){
          executor.remove(getRunnableFromName(threadName));
        }
       }
   }