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