Skip to content

JeremyLiao/rxjava-retry

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 

Repository files navigation

rxjava-retry

封装了几个处理RxJava Retry操作的类

OverView

我们希望对RxJava失败的场景进行重试

RxJava的流程失败一般有两种场景:

  • 失败的时候抛出RuntimeException,以onError结束,如Retrofit网络请求
  • 失败只是一个结果,不会抛出RuntimeException,最后会以onComplete结束

不抛出RuntimeException的场景

提供RetryWrapper进行处理

特别的,如果流程以Boolean返回标识成功或者失败,我们提供了BooleanRetryWrapper进行处理

抛出RuntimeException的场景

提供RetryWhen进行处理

提供了rxjava和rxjava2的版本

rxjava-retry for rxjava

rxjava-retry for rxjava2

Demo

定义source

生成一个0-100的随机整数,小于50代表成功,大于50代表失败,这代表了成功率为50%。

定义两个源,一个以Boolean值返回成功失败,另一个失败的时候会抛出RuntimeException:

Observable.just(new Random())
    .map(new Func1<Random, Integer>() {
        @Override
        public Integer call(Random random) {
            return random.nextInt(100);
        }
    })
    .map(new Func1<Integer, Boolean>() {
        @Override
        public Boolean call(Integer integer) {
            Log.d("test", "executeTimes: " + executeTimes++);
            return integer < 50;
        }
    });
Observable.just(new Random())
    .map(new Func1<Random, Integer>() {
        @Override
        public Integer call(Random random) {
            return random.nextInt(100);
        }
    })
    .doOnNext(new Action1<Integer>() {
        @Override
        public void call(Integer integer) {
            Log.d("test", "executeTimes: " + executeTimes++);
            if (integer > 50) {
                throw new RuntimeException();
            }
        }
    });

使用

  • 不抛出RuntimeException的场景
private void retry1() {
    executeTimes = 0;
    new BooleanRetryWrapper(sourceMayFail())
            .retry(3)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<Boolean>() {
                @Override
                public void call(Boolean aBoolean) {
                    Toast.makeText(RxJavaDemo.this, "testRetry complete: " + aBoolean,
                            Toast.LENGTH_SHORT).show();
                    Log.d("test", "testRetry complete: " + aBoolean);
                }
            }, new Action1<Throwable>() {
                @Override
                public void call(Throwable throwable) {
                    Toast.makeText(RxJavaDemo.this, "testRetry error: " + throwable.toString(),
                            Toast.LENGTH_SHORT).show();
                    Log.d("test", "testRetry error: " + throwable.toString());
                }
            });
}
  • 抛出RuntimeException的场景
private void retry2() {
    executeTimes = 0;
    sourceMayFailThrow()
            .retryWhen(new RetryWhen(3, 500))
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    Toast.makeText(RxJavaDemo.this, "testRetry complete: " + integer,
                            Toast.LENGTH_SHORT).show();
                    Log.d("test", "testRetry complete: " + integer);
                }
            }, new Action1<Throwable>() {
                @Override
                public void call(Throwable throwable) {
                    Toast.makeText(RxJavaDemo.this, "testRetry error: " + throwable.toString(),
                            Toast.LENGTH_SHORT).show();
                    Log.d("test", "testRetry error: " + throwable.toString());
                }
            });
}

Demo代码:

RxJavaDemo

About

封装了几个处理RxJava Retry操作的类

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages