是否可以重新订阅Retrofit 2 observable?

时间:2015-11-05 02:52:57

标签: android retrofit rx-java rx-android

我正在使用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处理配置更改?我可以使用不同的方法吗?

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?。如果有人可以解释如果他们像我的例子一样被使用的问题,那将会很棒。