Ich habe eine App, die MVP-Muster mit einem Loader
, um das Presenter-Objekt auf Ansicht Erholung (es gibt einen Artikel über diese here). Ich bin neu in Dagger 2 und versuche, es zusammen mit dem aktuellen Code zu implementieren.Dolch 2 mit MVP, vermeiden Sie das Erstellen zusätzlicher Präsentator Objekt auf Ansicht Erholung
Ich habe es geschafft, es funktioniert, aber jetzt ist mein Presenter zweimal erstellt. Zuerst wurde es unter Verwendung einer Factory-Klasse erstellt, die in onCreateLoader
initialisiert wurde, aber dann, als ich die Dagger 2-Implementierung hinzufügte, hatte ich zwei Objekte erstellt (in der Factory-Klasse und beim Injizieren).
Jetzt vermeide ich es, einen neuen Moderator in onCreateLoader
zu erstellen und übergibt stattdessen den injizierten Moderator. Das Problem besteht in der Wiedereröffnung der Ansicht: Jedes Mal, wenn die Ansicht zerstört und neu erstellt wird, wird ein neuer Präsentator in OnCreate
/OnCreateView
injiziert. Dies ist das Szenario:
Ein neuer Moderator injiziert wird:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... getControllerComponent().inject(this); ... }
Loader
Initialisierung wirdonCreateLoader
aufgerufen, wenn dieLoader
nicht vorhanden ist. Beachten Sie, dass wir den Moderator, die injiziert wurde passieren:@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getLoaderManager().initLoader(PRESENTER_LOADER_ID, null, this); } @Override public Loader<MyPresenter> onCreateLoader(int id, Bundle args) { switch (id) { case PRESENTER_LOADER_ID: return new PresenterLoader<>(getContext(), presenter); //return new PresenterLoader<>(getContext(), new MyPresenterFactory()); } return null; }
Zuordnung der Moderator vom
Loader
erhalten. Wenn es gerade erstellt wurde, weisen wir dasselbe Objekt zu, das bereits zugewiesen wurde, sodass nichts passiert. Aber wenn die Ansicht neu erstellt wurde, hat Dagger 2 einen neuen Moderator eingespritzt und hier werfen wir den neuen Moderator weg und ersetzen ihn durch den alten Moderator vonLoader
.@Override public void onLoadFinished(Loader<MyPresenter> loader, MyPresenter data) { this.presenter = data; }
Ich möchte die Presenter-Instanz verwalten, damit ± was ich will; Mein Problem ist das Erstellen eines redundanten Presenterobjekts in jeder Ansichtsreproduktion. Erstens ist es unnötig, und außerdem enthält die Ansicht einen Verweis auf einen anderen Präsentator, bis die Last beendet ist. Offensichtlich benutze ich den Moderator während dieser Zeit nicht (nach der Injektion und bevor die Ladung fertig ist), aber ich mag sie definitiv nicht und habe Angst, dass dieser neue Moderator irrtümlicherweise in der Zukunft verwendet wird.
Dagger 2 Experten ist es eine Möglichkeit, den Presenter zum ersten Mal zu erstellen (vor Loader
erstellt wird), aber es auf Sicht Erholung zu vermeiden? Danke vielmals!
Könnten Sie die Dolch-Komponentendefinition und Module teilen, von denen es abhängt? –