2015-11-05 83 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?。如果有人可以解釋真正的問題,如果他們像我的例子一樣使用,那會很棒。