Tôi đang sử dụng rxjava trong ứng dụng Android của mình để xử lý các yêu cầu mạng không đồng bộ. Bây giờ tôi chỉ muốn thử lại một yêu cầu mạng không thành công sau khi một thời gian nhất định trôi qua.
Có cách nào để sử dụng retry () trên một Observable nhưng chỉ thử lại sau một khoảng thời gian nhất định không?
Có cách nào để cho Người quan sát biết hiện đang được thử lại (thay vì thử lần đầu tiên) không?
Tôi đã xem xét debounce () / TuettleWithTimeout () nhưng chúng dường như đang làm điều gì đó khác.
Biên tập:
Tôi nghĩ rằng tôi đã tìm thấy một cách để làm điều đó, nhưng tôi muốn xác nhận rằng đây là cách chính xác để làm điều đó hoặc những cách khác tốt hơn.
Những gì tôi đang làm là thế này: Trong phương thức call () của Observable.OnSubscribe của tôi, trước khi tôi gọi phương thức Subscriber onError (), tôi chỉ cần để Thread ngủ trong khoảng thời gian mong muốn. Vì vậy, để thử lại sau mỗi 1000 mili giây, tôi làm như sau:
@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);
}
}
Vì phương pháp này đang chạy trên một luồng IO nên nó không chặn giao diện người dùng. Vấn đề duy nhất tôi có thể thấy là ngay cả lỗi đầu tiên được báo cáo với độ trễ, vì vậy độ trễ vẫn có ngay cả khi không có thử lại (). Tôi muốn tốt hơn nếu độ trễ không được áp dụng sau một lỗi mà thay vào đó là trước khi thử lại (nhưng không phải trước lần thử đầu tiên, rõ ràng là).
Error:(73, 20) error: incompatible types: RetryWithDelay cannot be converted to Func1<? super Observable<? extends Throwable>,? extends Observable<?>>