Retrofit2 Schwanzrekursion mit RxJava / RxAndroid

Ich versuche wirklich, die Verwendung von @ in den Griff zu bekommRetrofit mitRxJava / RxAndroid. Ich habe dies mit normalen @ getRetrofit2 Callback -Methode in einer früheren App ohne die Verwendung vonReactive Programming und es hat gut funktioniert. Also, hier ist es. Ich muss einfachTail Recall eine Funktion zum Abrufen allerLocal Government vom Server. DasAPI verwendet Paginierung(I have to construct the URL with ?page=1, perPage=2). Ich muss das tun, bis ich die ganzen Daten habe. Also, unten ist meinRx code

    public static Observable<LgaListResponse> getPages(Context acontext) {
    String token = PrefUtils.getToken(acontext);
    BehaviorSubject<Integer> pageControl = BehaviorSubject.<Integer>create(1);
    Observable<LgaListResponse> ret2 = pageControl.asObservable().concatMap(integer -> {
        if (integer > 0) {
            Log.e(TAG, "Integer: " + integer);
            return ServiceGenerator.createService(ApiService.class, token)
                    .getLgas(String.valueOf(integer), String.valueOf(21))
                    .doOnNext(lgaListResponse -> {
                        if (lgaListResponse.getMeta().getPage() != lgaListResponse.getMeta().getPageCount()) {
                            pageControl.onNext(initialPage + 1);
                        } else {
                            pageControl.onNext(-1);
                        }
                    });
        } else {
            return Observable.<LgaListResponse>empty().doOnCompleted(pageControl::onCompleted);
        }
    });

    return Observable.defer(() -> ret2);
}

Und meine ServiceGenerator-Klasse

    public class ServiceGenerator {

        private static final String TAG = "ServiceGen";
        private static OkHttpClient.Builder builder = new OkHttpClient.Builder();

        private static Retrofit.Builder retrofitBuilder =
                new Retrofit.Builder()
                        .baseUrl(BuildConfig.HOST)
                        .addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io()))
                        .addConverterFactory(GsonConverterFactory.create(CustomGsonParser.returnCustomParser()));

        public static <S> S createService(Class<S> serviceClass, String token) {

            builder.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));
            /*builder.addNetworkInterceptor(new StethoInterceptor());*/
            builder.connectTimeout(30000, TimeUnit.SECONDS);
            builder.readTimeout(30000, TimeUnit.SECONDS);
            if (token != null) {
                Interceptor interceptor = chain -> {
                    Request newRequest = chain.request().newBuilder()
                            .addHeader("x-mobile", "true")
                            .addHeader("Authorization", "Bearer " + token).build();
                    return chain.proceed(newRequest);
                };
                builder.addInterceptor(interceptor);
            }
            OkHttpClient client = builder.build();

            Retrofit retrofit = retrofitBuilder.client(client).build();
            Log.e(TAG, retrofit.baseUrl().toString());
            return retrofit.create(serviceClass);
        }

        public static Retrofit retrofit() {
            OkHttpClient client = builder.build();
            return retrofitBuilder.client(client).build();
        }

        public static class CustomGsonParser {

            public static Gson returnCustomParser(){
                return new GsonBuilder()
                        .setExclusionStrategies(new ExclusionStrategy() {
                            @Override
                            public boolean shouldSkipField(FieldAttributes f) {
                                return f.getDeclaringClass().equals(RealmObject.class);
                            }

                            @Override
                            public boolean shouldSkipClass(Class<?> clazz) {
                                return false;
                            }
                        })
                        .create();
            }
        }
    }

Also, ich habe beim ersten Anruf bemerkt, dass ich eine Antwort bekomme, aber beim zweiten, dem440Error ist geworfen. Die URL wird gebildet, aber die Anfrage wirft ein400Error. Ich weiß nicht, warum es ein @ wir400 alles funktioniert gut, wenn ichPOSTMAN zu testen. Und ich habe es auch mit meinem alten Code getestet. DasLog ist zu lang, also setze ich es inpastebin LOGS Hilfe, danke. Ich habe den größten Teil dieser App mit @ geschriebRxAndroid / RxJava. Vielen Dan

Antworten auf die Frage(2)

Ihre Antwort auf die Frage