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