Welche Rolle spielt die Aktivitätsklasse in MVC?

8

Ich weiß, dass es dazu einige Fragen gab, aber ich habe immer noch Schwierigkeiten zu verstehen, welche Rolle die Activity -Klasse bei der Implementierung des traditionellen Model-View-Controller-Entwurfsmusters auf Android spielen sollte.

Mein Bauchgefühl ist, dass es der Controller sein sollte, aber das bedeutet eine Eins-zu-Eins-Beziehung zwischen UI-Bildschirmen (da Sie ein Activity pro Bildschirm haben müssen) und Controllern, die den Punkt der lockeren Kopplung von MVC besiegen zwischen den verschiedenen Komponenten.

    
donturner 15.02.2012, 10:51
quelle

4 Antworten

7

Sie haben Recht. Die XML-Schnittstellen können als Ansicht definiert werden und Ihre andere Klasse arbeitet mit Daten als Modell .

Die Aktivität empfängt alle Ereignisse und Benutzereingaben aus der Ansicht. Daher können wir leicht sagen, dass dies der Controller ist.

Aber lassen Sie uns klar sein, es ist kein perfektes (gibt es wirklich?) MVC

Sehen Sie sich diese Frage an, genauer gesagt, den ersten Kommentar des akzeptierten antwort, es kann nützlich sein

    
grunk 15.02.2012, 10:57
quelle
1

Aktivitäten können zu kompetenten Controllern führen, und mit Fragmenten können Sie auch hierarchische MVC implementieren. Der größte Teil der Arbeit von MVC hängt vom Programmierer ab, denn selbst in den strengsten Frameworks gibt es immer noch Möglichkeiten, verrückte Dinge tun .

    
Danyal Aytekin 14.03.2014 17:40
quelle
0

Ich denke, die Verwirrung könnte darin bestehen, dass eine Ansicht als XML definiert wird, und daher wird die Aktivität fälschlicherweise als Ansicht betrachtet. Es ist nicht. Sie übergeben die Ansicht (Ihr XML-Layout) an die Aktivität, die dann die im XML-Layout enthaltenen Ansichten aufbläht. Ihre Aktivität übergibt auch Daten (Modelle) an Ihre Ansichten (EditText, TextView, erweiterte Version der Basisansichten usw.).

Wenn Sie MVC wirklich wollen, können Sie dies erreichen, indem Sie einfach Ihre Ansicht in einem XML-Layout einrichten und ein Ansichtsobjekt erstellen, das sich von Ihrer Stammansicht aus erstreckt (wenn es eine RelativeLayout-Erweiterung ist). Von dort fügen Sie Ihre Accessor-Methoden und die für diese Ansicht benötigte Logik hinzu, und Sie können dann Unit-Tests hinzufügen.

In der Aktivität werden Sie nicht mehr die ID des Layouts übergeben und stattdessen etwas in der Art tun:

%Vor%

Natürlich werden fast alle Apps dies nicht tun und Sie müssen das wirklich nicht tun. Das Aufrufen von findViewById reicht aus, um auf dieses Ansichtsobjekt zu verweisen und die darin enthaltenen Methoden aufzurufen. Was meiner Meinung nach MVC ist.

    
CodyEngel 07.06.2016 14:24
quelle
-1

Android hat keine gute Architektur und folgt nicht dem MVC-Entwurfsmuster.

Der beste Weg, um Aktivitäten in MVC zu konzeptualisieren, ist eine View (mit einer gewissen Steuerungslogik), da sie jedes Mal zerstört wird, wenn eine Konfigurationsänderung stattfindet, beispielsweise eine Bildschirmrotation oder eine Gebietsschemaänderung, die ihren gesamten Status verliert.

>

Der Controller wäre in diesem Fall das Anwendungsobjekt, da es Ihre Brücke ist, um auf die Ansicht (Aktivität und seine GUI-Komponenten) von Code außerhalb des Aktivitätskontexts zuzugreifen. Sie müssen Singletons verwenden, damit zu einem bestimmten Zeitpunkt nur ein Application-Objekt vorhanden ist. Andernfalls wird pro Prozess ein Application-Objekt vorhanden sein. Das Anwendungsobjekt eignet sich nicht zum Speichern des Modells, da sein Lebenszyklus von dem der Aktivitäten getrennt ist. Sie kann zu jedem Zeitpunkt des Lebenszyklus einer Aktivität zerstört und neu erstellt werden (während sich die Anwendung im Hintergrund befindet), ohne dass sie neu gestartet wird. Dann werden alle Variablen und Referenzen, die nicht innerhalb ihrer onCreate () -Methode zugewiesen wurden, null. p>

Das Modell muss daher in einem GUI-losen, kopflosen Fragment mit setRetainInstance (true) gespeichert werden, das mit einer Aktivität verknüpft ist und jedes Mal, wenn die Aktivität neu erstellt wird, erneut an das Modell angehängt werden muss. Sie müssen einen Fragmentmanager verwenden, um sicherzustellen, dass Sie das beibehaltene Fragment wiederherstellen und nicht neu erstellen. Dies ist auch der beste Ort, um Hintergrundaufgaben auszuführen, Sie können sie jedoch auch im Anwendungsobjekt ausführen. Führen Sie niemals Aufgaben für eine Aktivität aus, da diese bei Konfigurationsänderungen zerstört werden.

    
Carlos Hoyos 01.09.2015 12:25
quelle

Tags und Links