执行doOn< ...>即使取消订阅

时间:2016-03-29 18:31:04

标签: android rx-java reactive-programming

我有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,结果将不会缓存在数据库中。我希望如此。

2 个答案:

答案 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();