0

我使用的线程池只有一个线程通过Android中的RecyclerView中的一个视图持有者执行一些网络任务(它们需要按顺序执行)。 这是工作,如果我滚动缓慢。但是如果我快速滚动,太多的任务将被推送到队列中,而我通过调试发现这些任务将完全阻塞队列。ExecutorService如果执行了太多请求,一个线程池会阻塞队列

我简化了代码(多),我现在用的是一个线程的线程池:

if (executorService == null) { 
    executorService = Executors.newFixedThreadPool(1); 
} 

executorService.execute(new Runnable() { 
    @Override 
    public void run() { 
     RessourceService.getCoverPage(url, callback); 
     while (waiting) {} 
    } 
}); 

那么,什么是替代,如果我想没有得到一个阻塞队列顺序执行网络任务?

任何帮助将不胜感激。

更新: 问题是在我的代码中的其他地方,而不是在上面张贴。正如我的问题所述,我正在通过回收者视图的视图执行请求。快速滚动时,图像不会被加载。我发现问题出现在回收站视图中的物品看不见时。原因是,由于我的“等待”变量为真,请求被锁定。我可以通过将其设置为静态并在每个请求之前将其设置为false来解决此问题,从而在另一个查看者中停止正在进行的请求。不过,@Jessie Brian Revil关于使用newSingleThreadExecutor的建议非常有意义。不是我的问题的直接解决方案,而是上述代码的合理解决方案(因此接受)。

回答

1

您是否尝试过使用newSingleThreadExecutor()

public static ExecutorService newSingleThreadExecutor() 

创建一个使用单个worker线程的 无界队列方式来运行的执行人。

(但请注意,如果此单个线程关闭前的执行期间终止 由于故障,一个新的人会 如果需要执行后续任务,取代它的位置。)

任务是保证执行依次为,并且在任何给定时间不会有超过一个任务为 。与其他等效的 newFixedThreadPool(1)不同,保证返回的执行程序不会被 重新配置为使用其他线程。

+0

谢谢!问题是我的代码中的其他地方,但你的答案仍然有帮助。查看我的问题的编辑。 – Langkiller