Einfache Thread-Management – Java – Android

Ich habe eine Anwendung, die einen neuen Thread erzeugt, wenn ein Benutzer nach einem zu filternden Bild fragt.

Dies ist die einzige Aufgabe, die ich habe und alle sind von gleicher Bedeutung.

  • Populieren Sie Spinner dynamisch in Android von Text bearbeiten
  • Retrofit POST-Anfrage w / Basic HTTP-Authentifizierung: "Kann nicht versuchen, gestreamten HTTP-Körper"
  • GIF-Datei im Splash-Screen Ionic
  • Genymotion startet kein virtuelles Android-Gerät
  • Android Webview: Erkennung, wenn das Rendering beendet ist
  • Ist BroadcastReceiver.onReceive immer im UI-Thread laufen?
  • Wenn ich zu viele gleichzeitige Threads frage (Max, den ich je will, ist 9), schlägt der Thread Manager eine RejectedExecutionException .

    In der Minute, was ich tue, ist;

    // Manage Concurrent Tasks private Queue<AsyncTask<Bitmap,Integer,Integer>> tasks = new LinkedList<AsyncTask<Bitmap,Integer,Integer>>(); @Override public int remainingSize() { return tasks.size(); } @Override public void addTask(AsyncTask<Bitmap, Integer, Integer> task) { try{ task.execute(currentThumbnail); while(!tasks.isEmpty()){ task = tasks.remove(); task.execute(currentThumbnail); } } catch (RejectedExecutionException r){ Log.i(TAG,"Caught RejectedExecutionException Exception - Adding task to Queue"); tasks.add(task); } } 

    Fügen Sie einfach die abgelehnte Aufgabe zu einer Warteschlange hinzu, und das nächste Mal, wenn ein Thread gestartet wird, wird die Warteschlange überprüft, um zu sehen, ob es einen Rückstand gibt.

    Die offensichtliche Frage damit ist, dass wenn die endgültige Aufgabe bei ihrem ersten Versuch abgelehnt wird, wird es nie wieder neu gestartet werden (bis danach nicht mehr benötigt wird).

    Ich frage mich nur, ob es ein einfaches Modell gibt, das ich für die Verwaltung dieser Art von Ding verwenden sollte. Ich brauche Aufgaben, um die Warteschlange zu benachrichtigen, wenn sie fertig sind, also weiß ich, dass es Platz gibt, aber ich bin mir nicht sicher, wie.

    Mit freundlichen Grüßen,

    Gavin

  • Fehler nach dem Hinzufügen der Play-Services-Bibliothek: ': app: transformClassesWithJarMergingForDebug'
  • Wie Stil PopupMenu?
  • Android Navigation Schublade
  • Flicker mit StageVideo auf Android Tablet?
  • Ziehbare Schublade mit Handgriff (anstelle von Aktionsleiste) oben auf andere Apps
  • Wie kann man OnClick in ListViews Adapter aufrufen
  • 3 Solutions collect form web for “Einfache Thread-Management – Java – Android”

    Der Grund für die RejectedExecutionException ist, weil AsyncTask einen eigenen Thread-Pool implementiert (nach Mr. Martelli's Antwort), aber einer, der bei maximal 10 gleichzeitigen Aufgaben abgedeckt ist. Warum haben sie diese Grenze, ich habe keine Ahnung.

    Daher ist eine Möglichkeit für Sie, AsyncTask zu klonen, erhöhen Sie die Grenze (oder gehen Sie unbegrenzt, was auch mit LinkedBlockingQueue möglich LinkedBlockingQueue ) und verwenden Sie Ihren Klon. Dann, vielleicht, senden Sie die Änderung als Patch auf AsyncTask für zukünftige Android-Versionen.

    Klicken Sie hier , um eine Google-Code-Suche nach AsyncTask – der erste Treffer sollte die Implementierung sein.

    Wenn du nur das Limit anheben willst, kannst du MAXIMUM_POOL_SIZE so groß sein, wie du es wahrscheinlich brauchst. Wenn du unbegrenzt werden willst, benutze den Null-Argument LinkedBlockingQueue Konstruktor anstelle des momentan verwendeten. AFAICT, der Rest des Codes bleibt wohl gleich.

    Du scheinst eine Version des Thread Pool Design Patterns implementiert zu haben – der Wikipedia-Artikel verweist auf viele hilfreiche Artikel zum Thema, die dir helfen können, deine Implementierung zu verfeinern. Ich empfehle auch diesen Java-spezifischen Artikel, der klare Code und Erklärung hat.

    Vielleicht ist eine Option, die Task auf eine Sperrwarteschlange (von Bitmaps) zu warten, anstatt Bitmap als Parameter zu nehmen, aber du musst einen Weg für die Aufgabe hinzufügen, die beendet werden soll.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.