我有一个带有四个标签的底栏。每个标签都是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>
的原因,因为我已取消订阅,我想再次重新订阅,这样我就可以毫无错误地执行网络通话。
由于
答案 0 :(得分:1)
<强>更新强>
如果您在CompositeSubscrition
中调用取消订阅,则无法再次向其添加新订阅。如果要再次使用相同的复合实例,则需要调用subscriptions.clear()
,或者可以在初始化片段时创建新实例。
<强>上一页强>
首先,如果您取消订阅任何可观察/流/可流动等,您将丢失任何传入的数据/事件。
如果您想获得订阅的最新结果,那么显然您应该在取消订阅之前进行此操作。
此处的问题是,您的订阅不应依赖于任何Fragment
或Activity
生命周期,除非它完全/已完成/已销毁。
因此,如果您知道您有长期请求,则应在android.app.Service
上订阅。
然后,您将面临在Services
和Fragments/Activities
之间来回沟通的另一个问题。
您的案例的简单解决方案是您可以在单例类中创建BehaviourSubject
(最好使用Dagger
将model
注入片段和服务)。然后在Service
订阅您长时间播放的视频流并将下一个事件发布到BehaviourSubject
BehaviourSubject
保存最后发出的数据。因此,下次在新创建的片段中订阅它们时,它将从最后一个发出的项目开始。
当然,这个答案只是根据您的需要涵盖一个用例,您可能需要做其他事情。