【发布时间】:2020-05-03 08:36:54
【问题描述】:
我曾经使用retrofit和rxjava处理带有o的Api的两个响应的Api。我正在创建响应模型和错误模型。 我不知道如何在一个 Api 中处理这两种响应,这是我的实现
@POST("login/")
Observable<Response<Object>> login(@Body LoginParamModel model);
这是我的 api 实现
RetroClient.getClient(ApiEndPointInterface.URl).create(ApiEndPointInterface.class)
.login(model).subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Response<Object>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Response<Object> loginDataModelResponse) {
mLoginDataModelResponse=loginDataModelResponse;
}
@Override
public void onError(Throwable e) {
mLoginView.LoginError(e.getMessage());
}
@Override
public void onComplete() {
if (mLoginDataModelResponse.code() == 200 || mLoginDataModelResponse.code() == 201) {
LoginDataModel loginDataModel = (LoginDataModel) mLoginDataModelResponse.body();
mLoginView.LoginResult(loginDataModel);
} else if (mLoginDataModelResponse.code() == 400) {
try {
mLoginView.LoginError(CommonUtill.JsonReader(mLoginDataModelResponse.errorBody().string()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
我取得了成功,但问题是我没有将对象类转换为模型类
LoginDataModel loginDataModel = (LoginDataModel) mLoginDataModelResponse.body();
我遇到了这种类型的异常:
W:io.reactivex.exceptions.UndeliverableException:无法将异常传递给消费者,因为它已经取消/处置了流程,或者异常无处可去。进一步阅读:https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling | java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 com.model.login.LoginDataModel
W:原因:java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 com.model.login.LoginDataModel
LoginDataModel 是我的 Api 响应模型类,这里是 RetroClientClass
public class RetroClient {
private static Retrofit retrofit = null;
private Context mContext;
public static Retrofit getClient(String BaseUrl) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.level(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient
.Builder()
.addInterceptor(new Interceptor() {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
String token = CommonUtill.ACCESS_TOKEN;
Request request = chain.request();
request = request.newBuilder()
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.addHeader("Authorization", "Bearer " + token)
.addHeader("X-TOKEN-AUTHENTICATION", "True")
.build();
return chain.proceed(request);
}
})
.readTimeout(10, TimeUnit.SECONDS)
.connectTimeout(30, TimeUnit.SECONDS)
.addInterceptor(interceptor)
.build();
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(BaseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
}
return retrofit;
}
}
【问题讨论】:
-
ApiEndPointInterface是如何定义的。您是否设置了 RxJava 适配器:github.com/square/retrofit/tree/master/retrofit-adapters/…? -
@akarnokd 请检查更新后的代码
-
你试过
Observable<Response<LoginDataModel>>吗?
标签: object observable retrofit rx-java rx-android