我有Observable
可以在订阅后的某个时间内发出事件(例如来自Observable
的{{1}})。对此Retrofit
的订阅严格为Observable
,因此当View-related
被销毁时,我将取消View
订阅。即使我取消订阅Observable
,我也希望在doOnNext
中执行某些操作。
示例代码:
Subscription
即使final Observable<String> observable = ...; // will emit an event in some time in future
final Subscription subscription =
observable.doOnNext(new Action1<String>() {
@Override
public void call(String s) {
//this should be called even if the subscription is unsubscribed
}
}).subscribe();
subscription.unsubscribe();
已取消订阅,有没有办法确保调用doOn<something>
?
修改
让我给你一个更明确的例子:
Subscription
在final Observable<List<GithubRepo>> observable = getGithubReposFromApi();
subscription = observable
.doOnNext(githubRepos -> cacheGithubReposInDb(githubRepos))
.subscribe(githubRepos -> displayGithubReposInCurrentActivity(githubRepos));
Activity's
:
onDestroy
现在......如果在subscription.unsubscribe();
被销毁后收到githubRepos
,结果将不会缓存在数据库中。我希望如此。
答案 0 :(得分:1)
我认为你可以做以下两件事之一:
1。)只有两个Subscribers
:一个用于View
个相关内容,另一个用于您当前在doOnNext
中处理的其他副作用。要仍然只有一个上游订阅,您可以使用:
Observable sharedObservable = observable.replay().refCount();
或者只是
Observable sharedObservable = observable.share();
// which is the same as observable.publish().refCount();
2。)使用
Observable observableThatWillNeverTrulyUnsubscribe = observable.doOnNext(/* your doOnNext */).publish().autoConnect();
现在,当您的Subscriber
订阅observableThatWillNeverTrulyUnsubscribe
时,它会订阅observable
并开始发送项目。但是,当Subscriber
取消订阅时,不取消订阅,因此doOnNext
将继续收到项目。
我认为我宁愿选择第一个选项,因为第二个选择你放弃了observable
工作的任何可能性。
答案 1 :(得分:1)
好的,所以你想要运行计算但是想要切断依赖于Activity的用户。您可以发布()序列并订阅它。取消订阅后,原始序列仍将继续:
ConnectableObservable<T> co = observable
.doOnNext(githubRepos -> cacheGithubReposInDb(githubRepos))
.publish();
Subscription s = co.subscribe(githubRepos ->
displayGithubReposInCurrentActivity(githubRepos));
co.connect();
// ...
s.unsubscribe();