Saya menggunakan rxjava di aplikasi Android saya untuk menangani permintaan jaringan secara asinkron. Sekarang saya ingin mencoba lagi permintaan jaringan yang gagal hanya setelah waktu tertentu berlalu.
Apakah ada cara untuk menggunakan retry () pada Observable tetapi mencoba ulang hanya setelah penundaan tertentu?
Adakah cara untuk memberi tahu Observable yang saat ini sedang dicoba ulang (bukan mencoba untuk pertama kali)?
Saya telah melihat debounce () / throttleWithTimeout () tetapi mereka tampaknya melakukan sesuatu yang berbeda.
Edit:
Saya rasa saya menemukan satu cara untuk melakukannya, tetapi saya akan tertarik pada konfirmasi bahwa ini adalah cara yang benar untuk melakukannya atau cara lain yang lebih baik.
Apa yang saya lakukan adalah ini: Dalam metode call () dari Observable.OnSubscribe saya, sebelum saya memanggil metode Subscribers onError (), saya membiarkan Thread tidur selama waktu yang diinginkan. Jadi, untuk mencoba lagi setiap 1000 milidetik, saya melakukan sesuatu seperti ini:
@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);
}
}
Karena metode ini tetap berjalan di thread IO, metode ini tidak memblokir UI. Satu-satunya masalah yang dapat saya lihat adalah bahwa bahkan kesalahan pertama dilaporkan dengan penundaan sehingga penundaan tetap ada meskipun tidak ada retry (). Saya ingin lebih baik jika penundaan tidak diterapkan setelah kesalahan tetapi sebelum percobaan ulang (tapi jelas tidak sebelum percobaan pertama).
Error:(73, 20) error: incompatible types: RetryWithDelay cannot be converted to Func1<? super Observable<? extends Throwable>,? extends Observable<?>>