example Android: RunOnUiThread gegen AsyncTask




android handlerthread (4)

Ich glaube, Google schlägt Entwicklern vor, AsyncTask zu verwenden. Ich möchte jedoch wissen, wie es sich von der Verwendung von "new Thread" und dem anschließenden Aufrufen von "RunOnUiThread" hinsichtlich Leistung und Speichereffizienz unterscheidet.

Beispiel für die Verwendung von RunOnUithread:

    // some code #1
    Thread t = new Thread("Thread1") {
        @Override
        public void run() {
            // some code #2
            runOnUiThread(new Runnable() {
                public void run() {
                    // some code #3 (that needs to be ran in UI thread)

                }
            });

        }
    };
    t.start();

gegen

AsyncTask:

onPreExecute() {
   // some code #1
}

doInBackground() {
   // some code #2
}

onPostExecute() {
   // some code #3
}

Was sind die Vor- und Nachteile?

Bearbeiten:

Ich suche keine Antworten wie "Einfacher, den Code zu sehen", "Praktisch für Entwickler" usw. Ich suche tatsächlich nach technischen Unterschieden hinter den Kulissen.

Zum Beispiel wäre die Antwort von Paul Nikonowicz unten die Antwort gewesen, die ich sehen wollte. (Aber AsyncTask verhält sich genauso)


Answer #1

Demnach ist AsyncTask einfacher zu verwenden, weist jedoch einige Einschränkungen auf, wie z.

  • Kernpoolgröße und Arbeitswarteschlange sind festgelegt: 5 Pools / 10 Elemente
    • Es ist fest codiert und kann nicht geändert werden
  • Thread-Priorität ist fest auf niedrig eingestellt
  • Die Ausnahmebehandlung wird nicht so gut unterstützt wie bei Thread

Es wird auch einen weiteren Unterschied geben, den ich nicht herausgefunden habe. Sie können den vollständigen Quellcode von AsyncTask finden und einsehen, da Android OpenSource ist :-)

Viel Spaß beim Codieren in Android!


Answer #2

Wenn Sie einen new Thread , erstellen Sie jedes Mal einen neuen Thread, wenn Sie diesen ausführen. AsyncTask jedoch einen statischen Pool von maximal 128 Threads und verwendet einen alten Thread, sofern vorhanden. Wenn Sie AsyncTask 10-mal hintereinander ausführen, wird nur ein Thread erstellt, der die Aufgabe 10-mal anstelle von 10 Threads ausführt.

Das ist einer der Unterschiede unter vielen.


Answer #3

Der Hauptnachteil ist, dass die Verwendung Ihres eigenen Threads Ihre Aktivität am Leben erhält, wenn finish aufgerufen wird. Android gibt Ihrer Aktivität Zeit, damit alle Threads beendet werden können. Dies hat zur Folge, dass ein Aktivitätsleck entsteht, das dazu führt, dass Ihre App sehr langsam ausgeführt wird, bis die App zwangsweise vom Benutzer oder vom Betriebssystem beendet wird.

Sie können dies überprüfen, indem Sie sich Ihren Prozess in ADB ansehen. Selbst wenn die Aktivität beendet ist, bleibt sie hängen und beansprucht Ressourcen.

Wenn Sie also einen eigenen Thread verwenden, stellen Sie sicher, dass Sie ihn verwalten. Oder verwenden Sie einfach die Android-APIs. Es ist deine Entscheidung.


Answer #4

Es ist im Wesentlichen eine Annehmlichkeit. Das AsyncTask Framework verwaltet den Thread Pool und bietet eine einfache, verständliche Oberfläche. Es ist allgemein bekannt, dass Benutzeroberflächenaktivitäten in onPreExecute() , onPostExecute() und onProgressUpdate() können und dass das gesamte "schwere Heben" in doInBackground() wo Sie die Benutzeroberfläche nicht berühren können.

Entwickler können auf einfache Weise eine einfache Hintergrundaufgabe ausführen, mit der sie Aktualisierungen im UI-Thread veröffentlichen und anschließend Ergebnisse zurückgeben können. Es ist keine Magie, es ist nur eine Annehmlichkeit.







android-asynctask