2015-11-05 2 views
3

Я использую Retrofit 2 с RxAndroid, и я хочу сохранить запрос во время изменения конфигурации. Я думал, что смогу сделать это с Observable.cache(), как описано в this blog post и другими, которые я видел, но следующий поток вызывает InterruptedException.Возможно ли повторная подписка на Retrofit 2?

Observable<Result<List<Post>>> request = 
     postService.index(page).cache(); 
Subscription subscribeOne = request.subscribe(); 
subscribeOne.unsubscribe(); 
Subscription subscribeTwo = request.subscribe(); 

Я уверен, что следующий код в источнике Retrofit отвечает за отмену запроса, когда 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

У меня есть рабочий пример, который использует RxApp AsyncSubject реализовать кэш для запроса сети и код показывает, как подписаться на ожидающий запрос. Меня немного путают с субъектами Rx, так как с другой стороны они кажутся довольно удобными, но, с другой стороны, рекомендуется использовать их только в очень редких случаях, например. To Use Subject Or Not To Use Subject?. Было бы здорово, если бы кто-то мог объяснить, в чем проблема, если они используются, как в моем примере.

Смежные вопросы