0

AndroidのRecyclerViewのビューホールダーを使用して、1つのスレッドでスレッドプールを使用しています。 スクロールが遅い場合は動作しています。しかし、私が高速にスクロールしていると、あまりにも多くのタスクがキューにプッシュされます。これは、デバッグによって発見したキューが完全にブロックされています。ExecutorService実行中のリクエストが多すぎると、1つのスレッドスレッドプールがキューをブロックしています

私は、コードを簡略化している(多くの)私は、ねじ1を使用していますどこスレッドプール:

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

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

私がブロックされたキューを得ることなく順次ネットワークタスクを実行したいのであれば、代替何です?

ご協力いただきますようお願い申し上げます。

更新: 問題は私のコードのどこかにあり、上記のものではありませんでした。私の質問に記載されているように、私は、リサイクルビューのビューアを使ってリクエストを実行しています。高速にスクロールすると、画像はロードされません。私は、問題がリサイクル・ビューで見えなくなったときに問題が発生していることを知りました。この理由は、「待機中」変数が真であるために要求がロックされたためです。私はそれを静的にし、各要求の直前にそれをfalseに設定し、それによって進行中の要求を別のビューホルダーで停止することで解決できます。 それにもかかわらず、newSingleThreadExecutorの使用に関する@Jessie Brian Revilの示唆は完全に理にかなっています。私の問題に直接的な解決策ではなく、上記のコードに対する合理的な解決策です(したがって、受け入れます)。

答えて

1

あなたはnewSingleThreadExecutor()

public static ExecutorService newSingleThreadExecutor() 

を使用して アンバウンド形式のキューなしで動作する、単一のワーカースレッドを使用するExecutorのを作成しようとしています。 (この単一スレッドがシャットダウン前に、実行中に障害による を終了した場合、後続のタスクを実行するために必要であれば、新しいものが その場所を取ることに注意してください。)

タスクを実行するために保証されてい 順次となり、任意の時点で複数のタスクがアクティブになることはありません。 それ以外の場合は、 newFixedThreadPool(1)とは異なり、返されたエグゼキュータは、 が追加スレッドを使用するように再構成できないことが保証されています。

+0

ありがとうございました!問題は私のコードのどこかにありましたが、あなたの答えは依然として参考になりました。私の質問の編集を見てください。 – Langkiller

関連する問題