2015-11-05 81 views
3

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

回答

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 
+0

看到这是如何在活动环境中发挥作用,考虑到潜在的内存泄漏,必须在活动破坏后坚持主体/观察性等等。 – AndroidEx

+0

我只是在这个阶段真正尝试,但我有一个保留片段与演示者的“WeakHashMap”。在关闭活动时,主题取消订阅,并且主讲人为GC'd。但是,我不认为用户在请求期间返回会取消请求。保留片段的'onDestroy()'中的某种关闭代码可能是解决方案的一部分。 – Jimeux

0

我有一个使用AsyncSubject来实现对网络请求缓存工作示例RxApp和代码演示如何订阅挂起的请求。我对Rx主题有点困惑,因为另一方面他们看起来很方便,但另一方面建议他们只能用于很少的情况下,例如, To Use Subject Or Not To Use Subject?。如果有人可以解释真正的问题,如果他们像我的例子一样使用,那会很棒。