gpt4 book ai didi

android - 使用 RxJava/RxAndroid 的 Retrofit2 尾递归

转载 作者:行者123 更新时间:2023-11-30 01:06:30 26 4
gpt4 key购买 nike

我真的很想掌握使用 RetrofitRxJava/RxAndroid 的窍门。我在以前的应用程序中使用正常的 Retrofit2 Callback 方法完成了此操作,而没有使用 Reactive Programming 并且它工作正常。所以,就是这样。我需要 Tail Recall 一个用于从服务器获取所有 Local Government 的函数。 API 使用分页 (我必须使用 ?page=1, perPage=2 构造 URL)。我必须这样做,直到我掌握了全部数据。所以,下面是我的 Rx 代码

    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);
}

还有我的 ServiceGenerator 类

    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();
}
}
}

所以,我注意到在第一次调用时,我得到了响应,但在第二次调用时,抛出了 440Error。 URL 已形成,但请求抛出 400Error。我不知道为什么它会抛出 400 如果我使用 POSTMAN 进行测试,一切正常。而且,我也用我的旧代码进行了测试。 Log 太长了,所以我把它放到了pastebin LOGS任何帮助谢谢。我用 RxAndroid/RxJava 编写了这个应用程序的大部分内容。谢谢

最佳答案

我建议您简化事情(并删除递归)。首先使用诸如

之类的东西构建您的页面
public static Observable<LgaListResponse> getPages(Context acontext, int initialPage, int perPage) {  
String token = PrefUtils.getToken(acontext);
BehaviorSubject<Integer> pagecontrol = BehaviorSubject.<Integer>create(initialPage);
Observable<LgaListResponse> ret2 = pagecontrol.asObservable().concatMap(
new Func1<Integer,Observable<LgaListResponse>>() {
Observable<LgaListResponse> call(Integer pageNumber) {
if (pageNumber > 0) {
return ServiceGenerator.createService(ApiService.class, token)
.getLgas(String.valueOf(aKey), String.valueOf(perPage))
.doOnNext(
new Action1<LgaListResponse>() {
void call(LgaListResponse page) {
if (page.getMeta().getPage() != page.getMeta().getPageCount()) {
pagecontrol.onNext(page.getMeta().getNextPage());
} else {
pagecontrol.onNext(-1);
}
}
}
);
}
else {
return Observable.<LgaListResponse>empty().doOnCompleted(()->pagecontrol.onCompleted());
}
}
}
);

return Observable.defer(
new Func0<Observable<LgaListResponse>() {
Observable<LgaListResponse> call() {
return ret2;
}
}
);
}

然后订阅生成的可观察对象。它看起来很糟糕,因为我避免使用 lambda,但它应该可以工作。

关于android - 使用 RxJava/RxAndroid 的 Retrofit2 尾递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38837499/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com