如何重新订阅Observables

时间:2017-11-03 08:57:17

标签: android rx-java

我有一个带有四个标签的底栏。每个标签都是Fragment。我想在用户移动到另一个Fragment时停止任何网络通话,因此我将Observable所有CompositeSubscription次来电添加到onDestroyView(),我在onResume()/onViewAttached()取消订阅。下次用户进入屏幕时,所有网络呼叫都会失败(因为我已取消订阅),所以我想再次订阅。

我不确定我应该怎么做:不知怎的,我必须在为片段调用cache时重新订阅。我正在使用RxJava 1.

编辑:我已经检查了类似的问题,他们的答案提到了replay 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 } })); 运营商,但我不认为是因为他们要求获得之前发出的项目,而我只是希望能够再次执行任何网络呼叫。

这就是我订阅Observable进行网络通话的方式:

@Override
public void unsubscribe() {
    if (subscriptions != null && subscriptions.hasSubscriptions()) {
        subscriptions.unsubscribe();
    }
}

我如何取消订阅:

Timeline

示例用例:用户进入Observable屏幕,用户单击按钮并执行网络调用(在我的Presenter类中建模为onDestroyView(),就像我上面发布的代码一样)。然后用户退出此屏幕( 调用Timeline并取消订阅任何订阅)。一段时间后,用户再次进入HTTP FAILED: java.io.IOException: Canceled屏幕并单击该按钮。

这是我收到<plugin> <groupId>com.devskiller.jpa2ddl</groupId> <artifactId>jpa2ddl-maven-plugin</artifactId> <version>0.9.5</version> <configuration> <packages> <package>com.test.model</package> </packages> <outputPath>${project.build.directory}/schema_MariaDb.sql</outputPath> <jpaProperties> <property> <name>hibernate.dialect</name> <value>org.hibernate.dialect.MySQL5InnoDBDialect</value> </property> </jpaProperties> </configuration> </plugin> 的原因,因为我已取消订阅,我想再次重新订阅,这样我就可以毫无错误地执行网络通话。

由于

1 个答案:

答案 0 :(得分:1)

<强>更新

如果您在CompositeSubscrition中调用取消订阅,则无法再次向其添加新订阅。如果要再次使用相同的复合实例,则需要调用subscriptions.clear(),或者可以在初始化片段时创建新实例。

<强>上一页

首先,如果您取消订阅任何可观察/流/可流动等,您将丢失任何传入的数据/事件。

如果您想获得订阅的最新结果,那么显然您应该在取消订阅之前进行此操作。

此处的问题是,您的订阅不应依赖于任何FragmentActivity生命周期,除非它完全/已完成/已销毁。

因此,如果您知道您有长期请求,则应在android.app.Service上订阅。

然后,您将面临在ServicesFragments/Activities之间来回沟通的另一个问题。

您的案例的简单解决方案是您可以在单例类中创建BehaviourSubject(最好使用Daggermodel注入片段和服务)。然后在Service订阅您长时间播放的视频流并将下一个事件发布到BehaviourSubject

BehaviourSubject保存最后发出的数据。因此,下次在新创建的片段中订阅它们时,它将从最后一个发出的项目开始。

当然,这个答案只是根据您的需要涵盖一个用例,您可能需要做其他事情。