Frage

Ich bin viele Thumbnails von einem entfernten Server zu holen und sie in einer Rasteransicht angezeigt wird, mit AsyncTask. Das Problem ist, meine Kurzansicht zeigt 20 Thumbnails zu einer Zeit, so dass 20 AsyncTasks erstellt und startet 20 führt, einen pro Miniaturansicht.

ich RejectedExecution Ausnahme in meinem Code. Ich erinnere mich, irgendwo gelesen zu haben, dass es eine Begrenzung der Anzahl der Aufgaben ist, dass AsyncTask in der Warteschlange zu einem Zeitpunkt haben kann, ich könnte zu schlagen. War diese bar abgehoben?

Gibt es eine Möglichkeit, diese Grenze zu erhöhen? Ist es sicher nur diese Ausnahme ignorieren? (Durch einen leeren catch(RejectedException e){} Block?)

Ich verwende diesen Code auf Android 1.6 Emulator und die API-Ebene in meinem Code (minSDKVersion 3). [EDIT: Added SDK und API-Ebene info]

War es hilfreich?

Lösung

  

Ich erinnere mich irgendwo zu lesen, dass es   ist eine Begrenzung der Anzahl von Aufgaben, die   AsyncTask kann zu einem in seiner Warteschlange haben   Zeit, könnte ich das Schlagen werden. War   diese bar abgehoben?

AsyncTask erscheint derzeit 10 Threads zu unterstützen und eine Arbeits Queue-Tiefe von 10. In der Theorie, die nur 20 Elemente unterstützen würde ... wenn nichts anderes mit AsyncTask ist.

  

Gibt es eine Möglichkeit, diese Grenze zu erhöhen?

Greifen Sie den Quellcode, ändern, setzen Sie es in Ihrem eigenen Paket und Einsatz, dass man. Ich tat dies mit meinem AsyncTaskEx , obwohl das auf der Android 1.5 Quelle basiert.

  

Ist es sicher, nur diese ignorieren   Ausnahme?

Ihre Arbeit wird nicht für die Ausführung der Warteschlangen gestellt werden. Ob die „sicher“ ist bis zu Ihnen ist. Ich bin nicht bekannt, dass andere Auswirkungen auf die AsyncTask Infrastruktur.

Andere Tipps

Ich habe genau dieses gleiche getan, ich in einer Anwendung.

Starten von 20 parallelen Threads auf einmal herunterladen Thumbnails von einem Server und drücken Sie sie an einen Datenadapter klingt nicht wie eine gute Idee zu mir. Alle diese Themen werden stolpern gerade alle über einander und in die Quere kommen.

Stattdessen würde ich nur einen Thread starten, haben es die Thumbnails in einer Schleife zu sammeln, und fügen Sie sie an den Adapter, wie sie ankommen.

Sie können die Serien Testamentsvollstrecker mit AsyncTask.executeOnExecutor, nutzen Sie Ihre Aufgaben serialisiert werden, aber das wird die Aufgabe nur eine gleichzeitige Aufgabe zu der Zeit begrenzen. Könnte gut sein, obwohl, wenn Thumbnails bekommen:

myAsyncTask.executeOnExecutor (MyAsyncTask.SERIAL_EXECUTOR, [params]);

Das Problem ist, dass die Anzahl der anhängig AsyncTasks für AsyncTask.THREAD_POOL_EXECUTOR ist 128. Sobald die Warteschlange gefüllt ist keine neue AsyncTasks Warteschlange gestellt werden kann.

Von AsyncTask Quellcode:

private static final BlockingQueue<Runnable> sPoolWorkQueue =
        new LinkedBlockingQueue<Runnable>(128);

Meiner Meinung nach dieser Grenze macht absolut keinen Sinn überhaupt und AsyncTask.SERIAL_EXECUTOR hat eine unbegrenzte Warteschlange.

„Safe“ zu ignorieren - Sie müssen sicherstellen, dass jede Art von Benachrichtigung, dass Sie in der tun planten Post ausführen wird hier durchgeführt werden, wenn Sie den Fehler fangen - sonst könnte man etwas hängen, wenn Ihr einen anderen Code verlassen macht Annahmen über von dieser Aufgabe zu hören zurück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top