是否有可能重新订阅改造2可观察?
问题描述:
我在RxAndroid中使用了Retrofit 2,我希望在配置更改期间保持请求。我认为我可以用Observable.cache()
这样做,如this blog post和我见过的其他人所描述的那样,但以下流程导致InterruptedException
。是否有可能重新订阅改造2可观察?
Observable<Result<List<Post>>> request =
postService.index(page).cache();
Subscription subscribeOne = request.subscribe();
subscribeOne.unsubscribe();
Subscription subscribeTwo = request.subscribe();
我敢肯定,在改装源下面的代码是负责取消的请求时unsubscribe
被调用。
// 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();
}
}));
不取消订阅可以使所有的工作,但这可能会导致泄漏。有没有人设法通过Retrofit 2处理配置更改?我可以使用不同的方法吗?
答
感谢/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
答
我有一个使用AsyncSubject来实现对网络请求缓存工作示例RxApp和代码演示如何订阅挂起的请求。我对Rx主题有点困惑,因为另一方面他们看起来很方便,但另一方面建议他们只能用于很少的情况下,例如, To Use Subject Or Not To Use Subject?。如果有人可以解释真正的问题,如果他们像我的例子一样使用,那会很棒。
看到这是如何在活动环境中发挥作用,考虑到潜在的内存泄漏,必须在活动破坏后坚持主体/观察性等等。 – AndroidEx
我只是在这个阶段真正尝试,但我有一个保留片段与演示者的“WeakHashMap”。在关闭活动时,主题取消订阅,并且主讲人为GC'd。但是,我不认为用户在请求期间返回会取消请求。保留片段的'onDestroy()'中的某种关闭代码可能是解决方案的一部分。 – Jimeux