Ich benutze die neue Bibliothek Mosby MVI für eine neue Demo-App. Beim Definieren von Absichten in einem Presenter ist es inkonsistent, wenn die Absicht beim Anhängen der Ansicht ausgelöst wird.Mosby MVI: Inkonsequentes Bindungsverhalten der Absicht
Zum Beispiel: Lassen Sie uns definieren sehr einfache Absicht in einer Aktivität
public Observable<Boolean> intentLoadData(){
return Observable.just(true);
}
Der Präsentator bindet die Absicht wie:
@Override
protected void bindIntents() {
Observable<MailListViewState> loadData = intent(ExampleViewContract::intentLoadData).flatMap(interactor::loadData)
.observeOn(AndroidSchedulers.mainThread());
subscribeViewState(loadData, ExampleViewContract::render);
}
Diese Absicht ganz gut funktioniert. Wenn Sie zu einer anderen Aktivität (Detailansicht) navigieren und zurück navigieren, wird bindIntents()
als die Absicht bezeichnet, die neu erstellt wird. intentLoadData()
gibt kein neues Element aus, und der MviBasePresenter wird den vorherigen ViewState mit dem internen BehaviorSubject bereitstellen.
Mein Problem ist: Wenn ich den Intent (zum Nachladen der Daten) leicht anpassen. Die Absicht beginnt, ein Element auszugeben, wenn die Ansicht erneut angefügt wird.
lässt also die Absicht ändern:
private PublishSubject<Boolean> mReloadDataSubject = PublishSubject.create();
private void reloadData(){
mReloadDataSubject.onNext(true);
}
public Observable<Boolean> intentLoadData(){
return mReloadDataSubject.startWith(true);
}
Nein, wenn auf eine neue Aktivität der Navigation und zurück. Die Absicht gibt ein neues Objekt aus, wenn die Ansicht erneut angefügt wird. In meinem Fall führt dies zu einem neuen APU-Aufruf an das Backend, um die Daten neu zu laden, anstatt den letzten ViewState erneut zu verwenden. Dies passiert auch, wenn reloadData()
nie aufgerufen wird.
Dieses Verhalten fühlt sich sehr inkonsistent an. Wie kann ich mehr Kontrolle haben, wenn beim Wiederanbringen der Ansicht eine Absicht ausgelöst wird?
Update: Für mich noch interessanter ist, wie kann ich die automatische Emissions der Absichten zu vermeiden, wenn wieder anbringen, ohne die beobachtbaren Abschluss. Mit der Einführung eines PublishSubject lädt die Aktivität die gesamten Daten neu, selbst wenn sie sich gerade drehen.
Mein Problem ist mehr umgekehrt. Die Verwendung eines PublishSubject hilft später Intents auszulösen, aber wie kann ich verhindern, dass es in bindIntents() 'emittiert, wenn ich die Ansicht wieder anschließe? – TobiasRe
Was meinst du mit "Wiederanbringen der Ansicht"? Können Sie mir ein konkretes Beispiel geben? – sockeqwe
Ich verwende eine PublishSubject-Definition zum Laden von Daten von einem Web-Service wie in meiner ursprünglichen Frage. Die Aktivität startet und die Daten werden geladen. Wenn ich das Gerät rotiere, wird die Ladeabsicht während 'bindIntentActually()' im MviBasePresenter erneut ausgelöst. Ich möchte dieses unnötige Nachladen vermeiden. 'bindIntentActually()' wird in 'attachView()' mit 'viewAttachedFirstTime'set in diesem Fall auf false gesetzt. Deshalb beziehe ich mich darauf, wieder anzubringen. – TobiasRe