我正在使用RxAndroid的Retrofit 2,我想在配置更改期间保持请求。我认为我可以使用Observable.cache()
以及我见过的其他人InterruptedException
来完成此操作,但以下流程会导致Observable<Result<List<Post>>> request =
postService.index(page).cache();
Subscription subscribeOne = request.subscribe();
subscribeOne.unsubscribe();
Subscription subscribeTwo = request.subscribe();
。
unsubscribe
我非常确定Retrofit源代码中的以下代码负责在调用// Attempt to cancel the call if it is still in-flight on unsubscription.
subscriber.add(Subscriptions.create(new Action0() {
@Override public void call() {
call.cancel();
}
}));
时取消请求。
secure_compare
不取消订阅会使一切正常,但这可能会导致泄密。有没有人设法使用Retrofit 2处理配置更改?我可以使用不同的方法吗?
答案 0 :(得分:1)
感谢来自/u/insane-cabbage的提示,我设法用BehaviourSubject
(安全地封装在演示者中)实现了这一点。这是流程的一个例子。
BehaviorSubject<String> subject = BehaviorSubject.create();
/** User loads view and network request begins */
Observable.just("value")
.delay(200, TimeUnit.MILLISECONDS)
.subscribeOn(Schedulers.newThread())
.subscribe(subject::onNext);
Subscription portraitSub = subject.subscribe(
s -> System.out.println("Portrait: " + s));
/** onDestroy() */
portraitSub.unsubscribe();
/** Rotating... */
Thread.sleep(300);
/** onRestoreInstanceState() **/
Subscription landscapeSub = subject.subscribe(
s -> System.out.println("Landscape: " + s));
/** Output */
> Landscape: value
答案 1 :(得分:0)
我有一个工作示例RxApp,它使用AsyncSubject为网络请求实现缓存,代码显示了如何订阅待处理请求。我对Rx主题有点困惑,因为另一方面它们看起来非常方便,但另一方面,建议它们仅用于很少的情况,例如To Use Subject Or Not To Use Subject?。如果有人可以解释如果他们像我的例子一样被使用的问题,那将会很棒。