Estou usando o rxjava em meu aplicativo Android para lidar com solicitações de rede de forma assíncrona. Agora, gostaria de repetir uma solicitação de rede com falha somente após um determinado período de tempo.
Existe alguma maneira de usar retry () em um Observable, mas tentar novamente apenas após um certo atraso?
Existe uma maneira de informar ao observável que está sendo tentado novamente (em vez de tentado pela primeira vez)?
Eu dei uma olhada em debounce () / throttleWithTimeout (), mas eles parecem estar fazendo algo diferente.
Editar:
Acho que encontrei uma maneira de fazer isso, mas estou interessado em confirmar se essa é a maneira correta de fazer isso ou em outras maneiras melhores.
O que estou fazendo é o seguinte: no método call () do meu Observable.OnSubscribe, antes de chamar o método Subscribers onError (), simplesmente deixo o Thread dormir pelo tempo desejado. Então, para tentar novamente a cada 1000 milissegundos, eu faço algo assim:
@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);
}
}
Como esse método está sendo executado em um thread de IO, ele não bloqueia a IU. O único problema que vejo é que até o primeiro erro é relatado com atraso, então o atraso existe mesmo se não houver nova tentativa (). Eu gostaria melhor se o atraso não fosse aplicado após um erro, mas antes de uma nova tentativa (mas não antes da primeira tentativa, obviamente).
Error:(73, 20) error: incompatible types: RetryWithDelay cannot be converted to Func1<? super Observable<? extends Throwable>,? extends Observable<?>>