Retrofit Rx Android Retry не работает - PullRequest
0 голосов
/ 01 мая 2018

У меня следующий код

 public Retrofit provideRetorift(){

        OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
                .connectTimeout(60, TimeUnit.SECONDS)
                .readTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .build();

        return new Retrofit.Builder()
                .baseUrl(Constant.BASE_URL)
                .client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(ScalarsConverterFactory.create())
                .build();
    }

И вызов API, как показано ниже

 apiService().getApiRespo()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .retry(5)
                .doOnNext(new Consumer<User>() {
                    @Override
                    public void accept(User user) throws Exception {

                    }
                })
                .subscribe(new Observer<User>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(User user) {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });

Я добавил все в порядке тайм-аут HTTP, а также повторную попытку Java RX, когда я подключаюсь к Интернету между ними, он не будет повторяться. Работает только при первом доступе к Интернету.

Я новичок в Android, может ли кто-нибудь помочь мне, как повторить попытку автоматически, когда интернет-соединение между приложением пытается вызвать API

1 Ответ

0 голосов
/ 25 июля 2018

Возможно, этот пост полезен для вас.

https://medium.com/@v.danylo/server-polling-and-retrying-failed-operations-with-retrofit-and-rxjava-8bcc7e641a5a

этот код опрашивает сервер с откатом до тех пор, пока не получит код, отличный от 204. Вам следует использовать retryWhen вместо repeatWhen, потому что вы хотите повторить запрос в случае ошибки.

fun pollServerWithBackoff(videoId: String, maxAttempts: Int, delay: Int): Flowable<Response<ResponseBody>> {
        return api.download(videoId)
                .subscribeOn(Schedulers.io())
                .repeatWhen {
                    it
                            .zipWith(Flowable.range(1, maxAttempts),
                                    BiFunction { _: Any?, attempt: Int -> attempt })
                            .flatMap {

                                Flowable.timer((it * delay).toLong(), TimeUnit.SECONDS);
                            }

                }
                .takeUntil({

                    it.code() != 204
                })
                .filter {

                    it.code() != 204
                }
                .map{
                    if(it.code() in 200..300)
                        it
                    else
                        throw IOException(it.errorBody()?.toString() ?: "")
                }
    }
...