Ich habe eine untere Leiste mit vier Registerkarten. Jede Registerkarte ist eine . Ich möchte alle Netzwerkanrufe stoppen, wenn der Benutzer zu einem anderen Fragment
wechselt, also füge ich alle Observable
Anrufe zu einem CompositeSubscription
hinzu und ich melde mich von ihnen in onDestroyView()
ab. Wenn der Benutzer das nächste Mal den Bildschirm betritt, scheitern alle Netzwerkanrufe (da ich mich abgemeldet habe), also möchte ich mich erneut anmelden.Wie kann ich Observables wiederbestellen
Ich bin nicht sicher, wie ich das tun soll: Irgendwie muss ich neu abonnieren, wenn onResume()/onViewAttached()
für das Fragment aufgerufen wird. Ich benutze RxJava 1.
Edit: Ich habe ähnliche Fragen überprüft und ihre Antworten erwähnen cache
und replay
Operatoren, aber ich glaube nicht, dass das der Fall ist, weil sie fragen, auch die zuvor emittierten Elemente zu bekommen, während ich gerade Ich möchte wieder alle Netzwerkanrufe durchführen können.
Dies ist, wie ich für ein Netzwerk Anruf zu einem beobachtbaren bin abonnieren:
subscriptions.add(remoteDataSource.getFeedMore(localDataSource.getFirstStoredId())
.doOnNext(new Action1<FeedItemsRequestDetailsWrapper>() {
@Override
public void call(FeedItemsRequestDetailsWrapper wrapper) {
if (wrapper != null) {
localDataSource.saveFeed(wrapper.getFeedItemList());
localDataSource.saveServerState(wrapper.getFeedRequestDetails());
}
}
})
.subscribeOn(schedulerProvider.io())
.observeOn(schedulerProvider.mainThread())
.subscribe(new Action1<FeedItemsRequestDetailsWrapper>() {
@Override
public void call(FeedItemsRequestDetailsWrapper wrapper) {
// call to View to update
}
}));
Und wie ich abmelden:
@Override
public void unsubscribe() {
if (subscriptions != null && subscriptions.hasSubscriptions()) {
subscriptions.unsubscribe();
}
}
Beispiel Use Case: Benutzer Timeline
Bildschirm eingibt, Benutzer ein anklickt Button und ein Netzwerkaufruf wird ausgeführt (modelliert als Observable
in meiner Presenter-Klasse wie der Code, den ich oben gepostet habe). Dann verlässt der Benutzer diesen Bildschirm ( onDestroyView()
wird aufgerufen und alle Abonnements sind abgemeldet). Einige Zeit später gibt der Benutzer den Bildschirm Timeline
erneut ein und klickt auf die Schaltfläche.
Dies ist, wenn ich HTTP FAILED: java.io.IOException: Canceled
bekomme, weil ich mich abgemeldet habe und ich erneut abonnieren möchte, damit ich den Netzwerkanruf ohne Fehler ausführen kann.
Dank
Haben Sie 'clear' für' CompositeSubscription' rufen abbestellen? Wenn ja, müssen Sie mehr zeigen. – masp
Ich habe die Frage mit etwas Code aktualisiert. – Mes