Custom rx Func1 for retrofit response code handling

谁说胖子不能爱 提交于 2019-12-04 15:12:08

You can use Transformer in order to create a generic status code verifier:

class StatusCodeVerifierTransformer<T> implements Observable.Transformer<Response<T>, T> {

    @Override
    public Observable<T> call(Observable<Response<T>> responseObservable) {
        return responseObservable.flatMap(new Func1<Response<T>, Observable<T>>() {
            @Override
            public Observable<T> call(Response<T> loginResponse) {
                switch (loginResponse.code()) {
                    case 200:
                        return Observable.just(loginResponse.body());
                    case 202:
                        //need to Repeat
                        return Observable.error(new Status202Exception());
                    default:
                        return Observable.error(new Exception("unknown error"));
                }
            }
        });

    }
}

this transformer will take any Observable of Response<T> and will transform it to Observable of T, that emits errors according to your strategy.
Then use it with compose() operator:

  Observable<Login> login(String l, String p) {
    return api.loginUser(l, p)
            .compose(new StatusCodeVerifierTransformer<>())
   }

Now you have an Observable that will emit onError with your desired exception according to your status code handling.

Now, you can retry on error like with any Observable with retry operator, for instance like this:

 api.loginUser(l, p)
            .compose(new StatusCodeVerifierTransformer<>())
            .retry(new Func2<Integer, Throwable, Boolean>() {
                @Override
                public Boolean call(Integer retryCount, Throwable throwable) {
                    return throwable instanceof Login202Exception && retryCount < MAX_RETRY;
                }
            })

BTW, some comments:

requestOk - you definitely don't need to create Observable for emitting specific value once, just use the just() operator, like in the StatusCodeVerifierTransformer example. (or for any other synchronize operation, you have plenty of operators like fromCallable(), just(), from())
Generally, create() is not a safe method of creating an Observable anymore.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!