Używam rxjava w mojej aplikacji na Androida do asynchronicznej obsługi żądań sieciowych. Teraz chciałbym ponowić nieudane żądanie sieciowe dopiero po upływie określonego czasu.
Czy istnieje sposób użycia retry () na Observable, ale ponowna próba tylko po pewnym opóźnieniu?
Czy istnieje sposób, aby powiadomić Observable, że jest obecnie ponawiany (w przeciwieństwie do próby za pierwszym razem)?
Przyjrzałem się debounce () / throttleWithTimeout (), ale wydaje się, że robią coś innego.
Edytować:
Myślę, że znalazłem jeden sposób, aby to zrobić, ale byłbym zainteresowany albo potwierdzeniem, że jest to właściwy sposób, albo innymi, lepszymi sposobami.
Oto co robię: w metodzie call () mojego Observable.OnSubscribe, zanim wywołam metodę Subscribers onError (), po prostu pozwalam wątkowi spać przez żądany czas. Aby ponowić próbę co 1000 milisekund, robię coś takiego:
@Override
public void call(Subscriber<? super List<ProductNode>> subscriber) {
try {
Log.d(TAG, "trying to load all products with pid: " + pid);
subscriber.onNext(productClient.getProductNodesForParentId(pid));
subscriber.onCompleted();
} catch (Exception e) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e.printStackTrace();
}
subscriber.onError(e);
}
}
Ponieważ ta metoda jest uruchomiona w wątku IO i tak, nie blokuje interfejsu użytkownika. Jedynym problemem, jaki widzę, jest to, że nawet pierwszy błąd jest zgłaszany z opóźnieniem, więc opóźnienie występuje, nawet jeśli nie ma ponownej próby (). Wolałbym, żeby opóźnienie nie zostało zastosowane po błędzie, ale przed ponowną próbą (ale oczywiście nie przed pierwszą próbą).
Error:(73, 20) error: incompatible types: RetryWithDelay cannot be converted to Func1<? super Observable<? extends Throwable>,? extends Observable<?>>