2012-12-24 14 views
11

Hoffentlich kann mir jemand das erklären oder auf eine Ressource verweisen, die ich lesen kann, um mehr zu erfahren. Ich baue eine Anwendung, die ein Listview und eine benutzerdefinierte Liste-Adapter verwendet, die ich einer der vielen Tutorials online zur Verfügung wie diese modelliert aus:Verstehen, wann und warum verschiedene Android-Threads zu verwenden sind

http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/

Es hat gut funktioniert. Jedes Beispiel führt jedoch dazu, dass die Liste der anzuzeigenden Objekte erstellt und die erforderlichen Daten in separaten Threads gesammelt werden.

Ich möchte wissen, warum/Könnten Sie nicht alles in onCreate setzen? Ich kann keinen Grund sehen, warum Sie separate Threads benötigen, um dies zu erreichen. Gibt es eine allgemeine Form/Standard für wann/was muss ich auf bestimmten Threads ausführen?

Antwort

7

10 auf diesem sind sehr gut, wie bei den meisten Dingen.

Das Ergebnis ist: Die Benutzeroberfläche sollte immer ansprechend sein. Also if you have some operation that will take enough time that the user will notice, you might want to consider not running it in the UI thread. Einige übliche Beispiele sind network IO und database accesses. Es ist jedoch etwas von Fall zu Fall, also müssen Sie sich selbst ein wenig anrufen.

+0

Ok ist die Idee, Aufgaben zu delegieren, die mehr Zeit für andere Threads benötigen, so dass der Haupt-Thread nicht auf Informationen wartet von anderswo, während es etwas anderes laufen könnte. Während Sie alles von OnCreate ausführen können, ist es wahrscheinlich nicht die effizienteste Art, es zu tun. – Rarw

+0

Nun, es hängt davon ab, wie Sie "effizient" definieren. Die Best Practice schlägt im Allgemeinen vor, dass Sie, wenn Sie etwas haben, das eine "spürbare" Zeit in Anspruch nimmt, diese aus dem UI-Thread herausziehen und daher nicht mehr onCreate. Es hängt auch etwas davon ab, ob Sie die Ergebnisse benötigen oder nicht, um die Benutzeroberfläche usw. anzuzeigen. Aber ja, Ihr Kommentar ist im Allgemeinen richtig, würde ich sagen. – mfrankli

2

Nun, wenn das Erstellen der Liste von Objekten kein relativ kurzer Prozess ist, würde das in onCreate() den Haupt-Thread blockieren/verlangsamen. Wenn Sie einen separaten Thread verwenden, kann das Android-Betriebssystem alle Benutzeroberflächenelemente laden, während Sie darauf warten, dass die Liste ausgefüllt wird. Wenn dann die Liste der Objekte fertig ist, können Sie die bereits initialisierte Benutzeroberfläche sofort füllen, anstatt darauf zu warten, die Benutzeroberfläche erst zu initialisieren, nachdem die Liste der Objekte erstellt wurde. Es stellt sicher, dass Ihre Anwendung für den Benutzer immer reaktionsfähig ist.

0

Weil Sie nur 0,5 Sekunden haben, um OnCreate auszuführen - nach dem die gefürchtete ADN (Anwendung reagiert nicht) Fehlermeldung angezeigt wird. Wenn deine Listenansicht nicht einfach ist, wirst du es nicht rechtzeitig schaffen. Und selbst wenn Ihre Listenansicht sehr einfach ist, ist es besser, sie richtig zu lernen.

BTW: Ich benutze nicht einmal Threads, ich benutze einen oder mehrere Dienste, um die ganze Arbeit zu erledigen. Noch schwieriger zu implementieren, aber auch robuster und ansprechender.

0

Der Grund, warum Sie in onCreate oder im UI-Thread keine Aktionen ausführen, ist die Reaktionszeit. Wenn die Verarbeitung Ihrer App zu lange dauert, wird dem Benutzer ein Dialogfeld angezeigt, dass nicht mehr reagiert.

0

Mein Lehrer sagte einmal: Jede Software kann in einer einzigen (großen) Schleife geschrieben werden.

Und wenn Sie denken: Es kann ... vielleicht auf NDK-Ebene sein.

Einige SDK-Entwickler wollten den Softwareentwicklern Aufgaben erleichtern und das ist der Grund, warum die SDKs und Frameworks existieren.

Wenn Sie nichts von Multitasking benötigen, sollten Sie Single Threading verwenden.

Manchmal gibt es Zeitbeschränkungen, manchmal UI/Hintergrund/Netzwerkeinschränkungen und müssen Sachen in Diff-Threads tun.

0

Wenn Sie Quellcode von Asyntask und Handler sehen, sehen Sie ihren Code rein in Java. (Natürlich gibt es einige Ausnahmen, aber das ist kein wichtiger Punkt).

Warum heißt das? Es bedeutet keine Magie in Asyntask oder Handler. Sie erleichtern Ihre Arbeit als Entwickler.

Zum Beispiel:

Thread t = Thread.currentThread();
int id = t.getId();

Und warum sollten Sie neue verwenden Thread: Wenn Programa ruft methodA(), methodA() in einem anderen Thread mit ProgramA.You leicht testen, indem Sie laufen würde? Sie können dafür googlen. Viele viele Gründe.

Also, was ist der Unterschied?

AsyncTask und Handler sind in Java geschrieben (verwenden Sie intern einen Thread), also können Sie alles, was Sie mit Handler oder AsyncTask tun können, auch mit einem Thread erreichen.

Welcher Handler und AsyncTask helfen Ihnen wirklich?

Der offensichtlichste Grund ist die Kommunikation zwischen dem Anrufer-Thread und dem Worker-Thread. (Anrufer-Thread: Ein Thread, der den Worker-Thread aufruft, um eine Aufgabe auszuführen. Ein Anrufer-Thread ist möglicherweise nicht immer der UI-Thread). Und natürlich können Sie zwischen zwei Threads auf andere Weise kommunizieren, aber es gibt viele Nachteile, zB: Main Thread ist nicht Thread-sicher (in den meisten Fällen), mit anderen Worten, GEFÄHRLICH.

Deshalb sollten Sie Handler und AsyncTask verwenden. Sie erledigen die meiste Arbeit für Sie, Sie müssen nur wissen, welche Methoden Sie außer Kraft setzen können.

Differenzhandler und AsyncTask: Verwenden Sie AsyncTask, wenn der Anruferthread ein UI-Thread ist. Dies ist, was Android-Dokument sagt:

AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers

ich auf zwei Punkte hervorheben möchte:

1) Einfache Verwendung der UI-Thread (so verwenden, wenn Anrufer Thread UI-Thread ist).

2) Keine Notwendigkeit, Handler zu manipulieren. (bedeutet: Sie können Handler anstelle von AsyncTask verwenden, aber AsyncTask ist eine einfachere Option).

Es gibt viele Dinge in diesem Beitrag, die ich noch nicht gesagt habe, zum Beispiel: Was ist UI Thread, warum es einfacher ist. Sie müssen eine Methode hinter jeder Art kennen und nutzen es, Sie werden vollständig verstehen, warum ..

@: Wenn Sie Android Dokument lesen, werden Sie sehen:

Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue

Sie zunächst seltsam erscheinen mag .Nur verstehen, dass jeder Thread jede Nachrichtenwarteschlange hat. (wie eine To-Do-Liste), und der Thread nimmt jede Nachricht und tut es, bis die Nachrichtenwarteschlange leer ist. (Ah, vielleicht, als würdest du deine Arbeit beenden und ins Bett gehen). Wenn Handler kommuniziert, gibt es nur eine Nachricht an den Anrufer-Thread und es wartet auf die Verarbeitung. (Sophisticate? aber Sie wissen nur, dass Handler in sicherer Weise mit Anrufer-Thread kommunizieren kann)

Verwandte Themen