Was sind die Vorteile von Single-Threads für Android-Apps?

7

Ich habe auf http://developer.android.com eine Erklärung gelesen , in der es heißt:

Wenn eine Anwendung gestartet wird, erstellt das System einen Ausführungsthread für die Anwendung mit dem Namen "main". Dieser Thread ist sehr wichtig, da er für das Versenden von Ereignissen an die entsprechenden Widgets der Benutzeroberfläche zuständig ist, einschließlich des Zeichnens von Ereignissen. Es ist auch der Thread, in dem Ihre Anwendung mit Komponenten aus dem Android UI Toolkit interagiert. Das System erstellt nicht für jede Instanz einer Komponente einen eigenen Thread. Alle Komponenten, die im selben Prozess ausgeführt werden, werden im UI-Thread instanziiert, und Systemaufrufe an jede Komponente werden von diesem Thread gesendet.

Ich wollte nur wissen, warum Android sich für diese Single-Threaded-Modellarchitektur entschieden hat und nicht für Multi-Threaded. Was sind die Vorteile, die sie daraus ziehen?

Mayank
quelle
2
Wie Ihre Frage eine Philosophie mit dem Titel "Mehr Threads desto besser" vorschlägt: Beachten Sie, dass mehr Threads als Kerne eine immer höhere Leistungseinbuße bedeuten. Wenn Sie also ein Dual-Core-Telefon / -Tablet (oder -PC) haben, möchten Sie wirklich nur zwei Threads, die tatsächlich erhebliche Arbeit leisten (und wahrscheinlich einen dritten, der die Benutzerinteraktion übernimmt). Anwendungen, bei denen alles seinen eigenen Thread hat, sind im Allgemeinen schmerzhaft langsam
Richard Tingle

Antworten:

20

Android-Apps sind nicht Single-Threaded. Obwohl es einen Hauptthread gibt, wie in der von Ihnen zitierten Dokumentation beschrieben, können Apps so viele andere Threads starten, wie sie benötigen.

Der Vorteil aller GUI-Interaktionen in einem Thread besteht darin, dass der GUI-Code einfacher, schneller und vorhersehbarer sein kann, da der GUI-Status nicht gleichzeitig von verschiedenen Threads aus geändert wird. Es erleichtert App-Entwicklern auch die Thread-Sicherheit, indem es eine Nachrichtenwarteschlange bereitstellt, ähnlich wie in den GUI-Frameworks anderer Betriebssysteme. Der App-Autor muss nur sicherstellen, dass alle langen Vorgänge in Hintergrund-Threads ausgeführt werden, und Nachrichten an den Haupt-Thread zurücksenden, um die GUI zu aktualisieren. Auf diese Weise reagiert die GUI die ganze Zeit.

Dan Hulme
quelle
Meine erste "große App" beim Lernen ist in diese Falle geraten. Eine große Datenbanksuche auf demselben Thread wie die Benutzeroberfläche, sodass Sie überhaupt nicht abbrechen oder die Schaltfläche "Abbrechen" verwenden können, wenn der GUI-Thread gebunden ist. Sie lernen schnell, Threads / asychrone Aufgaben zu verwenden. "main" ist normalerweise der Ausführungspunkt in der Programmierung und der anfängliche oder "main" -Thread einer Anwendung wie int main()in C oder public static void main(String[] args)in Java und so weiter. Es läuft als Hauptbestandteil Ihrer Anwendung, da etwas der Ausgangspunkt sein muss.
RossC
+1. NetworkOnMainThreadExceptionbeweist nur, dass eine Android-App mehrere Threads unterstützt (und manchmal benötigt), um funktionsfähig zu funktionieren.
Andrew T.
1

In den Android-Dokumenten heißt es nur, dass der Hauptthread alle Funktionen der Benutzeroberfläche berechnen soll. Es ist die Aufgabe des Entwicklers, zusätzliche Threads zu erstellen, wenn Daten aus der lokalen SQLite-Datenbank oder aus dem Netzwerk abgerufen werden oder wenn Sie eine rechenintensive benutzerdefinierte Ansicht mit viel Anzeigelogik erstellen.

Einen wirklich umfassenden Einblick in die Parallelität in Android und das Multithreading finden Sie unter

Asynchrones Android von Steve Liles

Super tolles Buch.

Wes Eklund
quelle