8

Erstens, ich weiß, dass es mit Model View Presenter verschiedene Implementierungen gibt, und meiner Meinung nach, solange Sie die Ebenen der Abstraktion klar definiert haben und dann ihre Rollen übernehmen Implementieren Sie dieses Muster ist offen für die Interpretation. Ich habe dieses Muster in vielen Apps implementiert, wo es nur eine Activity gab. Ich habe jetzt ein neues Projekt gestartet, das mehrere Aktivitäten hat und angefügt Fragments, einschließlich verschachtelte Fragmente (ViewPager).Mehrere Aktivitäten/Fragmente und die Modellansicht Presenter-Muster

Ich versuche jetzt, den MVP zu diesem Projekt zu übersetzen, und ich habe eine Konzeptwand getroffen und möchte einige Anleitung und Einblicke.

Bisher habe ich die obige Struktur erstellt und begonnen, eine 1: 1-Beziehung mit View & Presenter (unabhängig von Activity oder Fragment) zu tun. Ich fühle, dass dies in Ordnung ist, wenn ich zum Beispiel eine Anfrage von einem Activity View an seinen Presenter gesendet habe, der ein Ergebnis an die Activity zurückgibt. Wie würde ich das Propagieren des Ergebnisses durchführen, dh alle anderen Aktivitäten/Fragmente aktualisieren das sind derzeit nicht in einem Paused() oder Stop() Zustand. Ich denke, in diesem Fall sollte es einen zentralen Moderator geben, der alle notwendigen Aktivitäts- und Fragmentansichten aktualisiert, aber ich bin mir nicht sicher, wie ich das machen soll.

Zeit, wenn jeder Activity und Fragment erstellt es eine neue Instanz eines Presenter-Klasse erstellt, als Referenz an sich vorbei (die Aktivitäten und Fragmente implementieren ihre eigenen Schnittstellen), die den Moderator speichert als WeakReference und kann die aufrufen relevante Schnittstellenmethoden beim Zurückgeben eines Ergebnisses.

Laut der Dokumentation wann immer Fragments miteinander kommunizieren möchten und die beigefügten Activity sollten Sie eine Callback-Schnittstelle verwenden. In diesem Sinne sollte ich eine Callback-Schnittstelle haben, die die Aktivität implementiert und die Fragments Callback zu, wann immer sie etwas anfordern, so dass im Wesentlichen nur die Aktivität einen Presenter und Model-Layer haben würde, die die Fragmente zurückrufen müssen, um verschiedene Anfragen zu machen ?

Tut mir leid, wenn das ein wenig durcheinander klingt, hoffentlich ist das klar genug, um zu verstehen, was ich erreichen will, und wenn ich in die richtige Richtung denke ... oder völlig daneben!

Antwort

1

Ich denke, das ist in Ordnung, einen Moderator in Aktivität zu haben. Grundsätzlich ist Aktivität wie ein Controller, sie sollte über den Moderator wissen.

Es wäre falsch, einen Moderator in ein Fragment einzufügen, wenn es auch für eine Aktivität oder ein anderes Fragment benötigt wird. Sie können einen Moderator nur dann in ein Fragment einfügen, wenn dieser Moderator speziell für Fragmente entworfen wurde.

die die Moderatorin speichert als WeakReference und können die entsprechenden Interface-Methoden aufrufen, wenn ein Ergebnis

Rückkehr Warum Sie eine WeakReference hier brauchen? Wenn Sie eine 1: 1-Beziehung haben, nehme ich an, dass Ihr Präsentator keinen eigenen Lebenszyklus hat, was bedeutet, dass der Lebenszyklus von einer Aktivität oder einem Fragment abhängt. Es besteht kein Risiko, Speicherlecks zu haben, weil es kein Singleton ist, oder? Es sollte sicher sein, eine starke Referenz zu haben.

Ich bin mir nicht sicher, ob ich deine Frage beantwortet habe, weil sie mir ein bisschen weit erscheint. Mein Punkt ist, dass Fragmente nur getrennte "Teile" der Aktivität sind und Sie sollten sie als Teile behandeln. Wenn der Moderator nur zu diesem Teil gehört, sollte er innen sein. Ansonsten sollte es in Aktivität sein.Sie haben recht, wenn Sie eine interface verwenden, um auf Aktivitäten zuzugreifen. Dies ist ein bekannter Designansatz, den Google in seinen Beispielen verwendet.

+0

Danke für Ihre Kommentare und Gedanken. Ich denke, ich werde den Presenter nur mit der Activity verwenden und die Fragmente aktualisieren lassen. Speicherlecks mit einem Singleton? Dies würde nur passieren, wenn der Singleton einen Verweis auf eine Aktivität oder ein Fragment hätte (im Grunde etwas mit einem Lebenszyklus, der kommen und gehen kann)? Wenn ja, verwende ich ein Singleton für etwas anderes, aber es enthält keine Referenzen. Ich benutze 'WeakReferences' mit Aktivitäten und Fragmenten (alles mit Lebenszyklus-Callbacks), da ich nicht' null' habe. Starke Referenzen auf Konfigurationsänderungen und die 'WeakReference' erlauben GC –

+0

Wenn Ihr Moderator kein Singleton ist, dann sollten Sie nicht ' Es gibt Probleme mit Konfigurationsänderungen, da der Präsentator selbst ebenfalls neu erstellt wird. Möglicherweise benötigen Sie eine 'WeakReference', wenn Sie jedoch ein beibehaltenes Fragment verwenden. Wie auch immer, es scheint, dass Sie klar verstehen, wie schwache Referenzen funktionieren, also muss ich das nicht erklären. Danke. –

+0

Nein, der Moderator ist kein Singleton. Nachdem der Moderator erstellt wurde, speichere ich eine Referenz in einer 'HashMap innerhalb des nicht beibehaltenen Header-Fragments und lade seine Referenz bei Konfigurationsänderungen mit der Aktivität zurück. ... Gerade wenn ich denke, ich verstehe etwas in Java, scheint es mir immer einen Kurvenball zu werfen! Danke für deinen Rat. –

1

Nein, keine Schnittstelle mehr. Sie verwenden entweder RxJava Observables, um alle Ansichten zu aktualisieren, wie beschrieben here oder eine Art Bus (Otto -vertreten oder EventBus). Und Sie werden es mögen, weil sie die Interaktion zu einfach machen.

+1

Danke für Ihre Kommentare, ich habe mir diese kurz angeschaut - und sehe durchaus machbar und interessant aus. Ich war auf der Suche nach einer Musterlösung oder einem Konzept, anstatt "diese Bibliothek nimmt die Komplexität weg". Ich bin nicht dagegen, dies oder andere Bibliotheken zu benutzen, die Probleme lösen, weit gefehlt, aber ich denke, es ist wichtig für mich, ein gutes Verständnis zu verstehen, bevor ich direkt in diese anderen Bibliotheken eintrete, die viele der Komplexitäten für dich behandeln. –

+0

© würde es Reaktive Programmierung Ansatz, nicht Bibliothek nennen. Und ich sehe in naher Zukunft keinen anderen Weg, Rx zu entkommen. –

+0

Ich werde auf Reactive-Programmierung/RxJava sicher, für jetzt, für mich und dieses Projekt Kommunikation durch die Hosting-Aktivität ist kein Problem. Ich bin nicht sicher, ob ich Ihre Überzeugung teile, dass es keine Möglichkeit gibt, Reaktive Programmierung zu "entkommen", jedoch respektiere ich Ihre Meinung. –