0

Ich verwende einen Threadpool mit nur einem Thread, um einige Netzwerkaufgaben (sie müssen nacheinander ausgeführt werden) durch einen Viewholder in einem RecyclerView in Android. Es funktioniert, wenn ich langsam scrolle. Aber wenn ich schnell scrollen werde, werden zu viele Aufgaben in die Warteschlange geschoben, was ich durch das Debuggen entdeckt habe, blockiert die Warteschlange vollständig.ExecutorService ein Thread Threadpool blockiert die Warteschlange, wenn zu viele Anfragen ausgeführt werden

Ich habe den Code (viel) vereinfacht, wo ich die eine bin mit Gewindethread:

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

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

Also, was die Alternativen ist, wenn ich ohne immer eine blockierte Warteschlange Netzwerk Aufgaben nacheinander ausgeführt werden soll ??

Jede Hilfe wird sehr geschätzt.

Update: Das Problem war woanders in meinem Code und nicht in der oben genannten. Wie in meiner Frage beschrieben, führe ich die Anfragen durch einen Viewholder einer Recyclerview aus. Beim schnellen Scrollen werden die Bilder nicht geladen. Ich stellte fest, dass das Problem auftrat, als ein Gegenstand in der Recycleransicht nicht mehr zu sehen war. Der Grund dafür war, dass die Anfrage gesperrt wurde, weil meine Variable "Warten" wahr war. Ich könnte es lösen, indem ich es vor jeder Anfrage statisch mache und es auf false setze und dadurch die laufende Anfrage in einem anderen Viewholder stoppe. Nichtsdestotrotz macht das Vorschlagen von @Jessie Brian Revil mit newSingleThreadExecutor Sinn. Keine direkte Lösung für mein Problem, aber eine vernünftige Lösung für den obigen Code (daher akzeptieren).

Antwort

1

Haben Sie newSingleThreadExecutor()

public static ExecutorService newSingleThreadExecutor() 

Erstellt ein Executor mit versucht, die einen einzelnen Worker-Thread aus einer unbeschränkten Warteschlange Betrieb verwendet.

(jedoch beachten, dass, wenn dieser einzelne Thread aufgrund eines Fehler während der Ausführung endet vor dem Abschalten, ein neues wird seinen Platz einnehmen, wenn nötig, um nachfolgende Aufgaben auszuführen.)

Aufgaben sind garantiert auszuführen sequenziell, und nicht mehr als eine Aufgabe wird aktiv zu jeder beliebigen Zeit sein. Im Gegensatz zu dem ansonsten äquivalenten newFixedThreadPool (1) ist der zurückgegebene Executor garantiert nicht rekonfigurierbar, um zusätzliche Threads zu verwenden.

+0

Vielen Dank! Das Problem war jedoch irgendwo anders in meinem Code, aber deine Antwort war immer noch hilfreich. Siehe die Bearbeitung meiner Frage. – Langkiller

Verwandte Themen