ฉันใช้ rxjava ในแอพ Android เพื่อจัดการคำขอเครือข่ายแบบอะซิงโครนัส ตอนนี้ฉันต้องการลองอีกครั้งคำขอเครือข่ายที่ล้มเหลวหลังจากผ่านไประยะหนึ่งแล้วเท่านั้น
มีวิธีใดบ้างในการใช้ retry () บน Observable แต่จะลองอีกครั้งหลังจากเกิดความล่าช้าบางอย่างเท่านั้น
มีวิธีใดที่จะแจ้งให้ผู้สังเกตการณ์ทราบว่ากำลังถูกลองใหม่ (ซึ่งตรงข้ามกับการทดลองในครั้งแรก) หรือไม่?
ฉันได้ดู debounce () / throttleWithTimeout () แต่ดูเหมือนว่าพวกเขาจะทำอะไรบางอย่างที่แตกต่างออกไป
แก้ไข:
ฉันคิดว่าฉันพบวิธีหนึ่งที่จะทำได้ แต่ฉันสนใจที่จะยืนยันว่านี่เป็นวิธีที่ถูกต้องในการทำหรือวิธีอื่นที่ดีกว่า
สิ่งที่ฉันกำลังทำอยู่นี้: ในวิธี call () ของ Observable OnSubscribe ของฉันก่อนที่ฉันจะเรียกใช้เมธอด Subscribers onError () ฉันเพียงแค่ปล่อยให้เธรดเข้าสู่โหมดสลีปตามระยะเวลาที่ต้องการ ดังนั้นในการลองใหม่ทุกๆ 1,000 มิลลิวินาทีฉันจะทำสิ่งนี้:
@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);
}
}
เนื่องจากวิธีนี้ทำงานบนเธรด IO อย่างไรก็ตามจึงไม่ได้ปิดกั้น UI ปัญหาเดียวที่ฉันเห็นคือแม้ข้อผิดพลาดแรกจะถูกรายงานด้วยความล่าช้าดังนั้นความล่าช้าจึงเกิดขึ้นแม้ว่าจะไม่มีการลองใหม่ () ฉันจะดีกว่านี้หากไม่ได้ใช้การหน่วงเวลาหลังจากเกิดข้อผิดพลาด แต่ก่อนที่จะลองใหม่ (แต่ไม่ใช่ก่อนการลองครั้งแรกอย่างเห็นได้ชัด)
Error:(73, 20) error: incompatible types: RetryWithDelay cannot be converted to Func1<? super Observable<? extends Throwable>,? extends Observable<?>>