rxjava: Can I use retry() but with delay?

后端 未结 14 2312
别那么骄傲
别那么骄傲 2020-11-28 18:25

I am using rxjava in my Android app to handle network requests asynchronously. Now I would like to retry a failed network request only after a certain time has passed.

14条回答
  •  广开言路
    2020-11-28 19:10

    instead of using MyRequestObservable.retry I use a wrapper function retryObservable(MyRequestObservable, retrycount, seconds) which return a new Observable that handle the indirection for the delay so I can do

    retryObservable(restApi.getObservableStuff(), 3, 30)
        .subscribe(new Action1(){
            @Override
            public void call(BonusIndividualList arg0) 
            {
                //success!
            }
        }, 
        new Action1(){
            @Override
            public void call(Throwable arg0) { 
               // failed after the 3 retries !
            }}); 
    
    
    // wrapper code
    private static  Observable retryObservable(
            final Observable requestObservable, final int nbRetry,
            final long seconds) {
    
        return Observable.create(new Observable.OnSubscribe() {
    
            @Override
            public void call(final Subscriber subscriber) {
                requestObservable.subscribe(new Action1() {
    
                    @Override
                    public void call(T arg0) {
                        subscriber.onNext(arg0);
                        subscriber.onCompleted();
                    }
                },
    
                new Action1() {
                    @Override
                    public void call(Throwable error) {
    
                        if (nbRetry > 0) {
                            Observable.just(requestObservable)
                                    .delay(seconds, TimeUnit.SECONDS)
                                    .observeOn(mainThread())
                                    .subscribe(new Action1>(){
                                        @Override
                                        public void call(Observable observable){
                                            retryObservable(observable,
                                                    nbRetry - 1, seconds)
                                                    .subscribe(subscriber);
                                        }
                                    });
                        } else {
                            // still fail after retries
                            subscriber.onError(error);
                        }
    
                    }
                });
    
            }
    
        });
    
    }
    

提交回复
热议问题