2016-05-26 13 views
0

Ich möchte ein MVP-Muster für die folgenden implementieren:
Meine Ansicht ist ein Listenfragment mit einer Liste.
Mein Modell sind die Daten, die in der Liste angezeigt werden, die von Netzwerkaufrufen stammen.
Mein Controller ist derjenige, der die Daten zwischen Ansicht und Modell übergibt.
Mein Fluss ist:
1) Ich mache eine Netzwerkanfrage und bekomme eine Antwort zurück, die ich zeige ~ 20 Elemente. Jeder Gegenstand hat eine Liste von URLs von Gegenständen (~ 70).
2) Beim Klick auf ein Element gehe ich in eine Schleife und übergebe an eine Volley-Queue Anfragen für jede dieser URLs (also im Wesentlichen) ~ 70 Volley-Anfragen werden nacheinander abgesendet. Als ich jede Antwort bekomme, aktualisiere ich meinen Adapter.Implementieren Sie MVP für die Übergabe von Daten aus dem Netzwerk zu Listenansichten

Frage:
Wie kann ich konvertieren (2), so dass ich den MVP verwenden und die Ansicht über eine Art von Callback-Mechanismus aktualisieren? Ich nehme an, es ist keine gute Idee, für jede dieser Antworten zu callen und onNotifyDataSetChanged() 70 mal zu wählen
Was ist die beste Praxis dafür?

mehr Kontext Balg

Ich habe eine Anwendung, die von 2 Listen Fragmenten und 1 einfachen Fragmente mit einer Layout-Ansicht zusammengesetzt ist.
Erste Liste Fragment zeigt eine Liste von ~ 20 Elemente.
Jedes Objekt, auf das geklickt wird, führt zu einem Netzwerkanruf, der von einem Server ~ 70 Elemente (max), die in einer anderen Liste im zweiten Listenfragment angezeigt werden, bringt.
Sobald der Benutzer auf die Listenelementdaten klickt, die für dieses Element spezifisch sind, werden sie aus dem Netzwerk abgerufen und im letzten Fragment angezeigt.
Also im Grunde ist die erste Liste auf Daten "gebrochen". Aber die Punkte in der zweiten Liste sind nicht mehr als ~ 70.

Design:
Ich habe Volley Queue für die Netzwerkaufrufe verwendet und funktionell funktioniert es gut und ich zeige die Daten, die ich brauche, gut.
Ich habe der Volleyanforderung einen Listener hinzugefügt und von meinem Listener aktualisiere ich meine Adapter.
Der Vorteil ist, dass als Antwort komme ich sie durch Benachrichtigung meines Adapters anzeigen, so dass der Benutzer nicht warten muss, bis alle 70 Anforderungen abgeschlossen sind, bevor Daten angezeigt werden.

Problem:
Aufgrund der Tatsache, dass beim Klicken des ersten Fragments als ich zum zweiten verschiebe ich diese Back-End-Anrufe starten und als ich in den dritten gehe diese Anrufe anstehen (ich kann es in dem sehen Logs), wenn ich zum dritten Fragment gehe, werden die Anrufe für den Rest der Gegenstände weiter geschossen und dasselbe, wenn ich zurück zum ersten gehe.
Aufgrund der Tatsache, dass ich die Antworten für diese Anfragen von der Volley in den Adaptern bekomme und das tatsächliche Fragment möglicherweise nicht mehr "relevant" ist, wie kann ich das besser gestalten?
Ich denke, irgendeine Art von Modell-Ansicht-Muster, aber in meinem Fall möchte ich nicht auf alle Netzwerkaufrufe zu beenden, um die Daten von meinem Modell (vorzugsweise) zu erhalten

+0

Wie kann ich diesen Beitrag verbessern? Kann mir jemand sagen, ob mein Beitrag nicht sehr hilfreich ist oder das, was ich beschreibe, kein allgemeines Problem ist? – Jim

Antwort

0

Sie können das gleiche Design verwenden Sie haben jetzt und nur hinzufügen, Tags, um die Anforderungen, die Sie für ein Fragment machen:

request.setTag("fragX"); 

dann, wenn Sie verstecken/entfernen Sie das Fragment können Sie tun:

getRequestQueue().cancelAll("fragX"); 

Dieses Sie empfangen „fragX“ -Antworten verhindern von den einstmals gewesenen in die Warteschlange gestellt.

Sie können die erhaltenen Antworten auch filerieren und noch weiter gehen und RxJava verwenden, so dass Sie mit Streams arbeiten und neben dem Filtern verschiedene andere nützliche Funktionen für die Antworten ausführen können.

Ich benutze jus, die als Gabel von Volley begann, aber jetzt viele Optionen einschließlich RxJava unterstützt. Sie können dort auch Beispiele und Volley-Migrationsproben finden.

+0

Bitte aktualisierten OP sehen – Jim