gpt4 book ai didi

android - RXjava和Retrofit处理空数据响应

转载 作者:搜寻专家 更新时间:2023-11-01 09:35:21 24 4
gpt4 key购买 nike

我使用 Rxjava 和 Retrofit 来处理来自 HTTP 服务器的响应。

大多数时候,数据响应都是这种格式:

{
code: 'OK',
data: {.....}
}

有时,data 属性不存在:

{
code: 'OK'
}

我创建了一个 BaseResponse 类。

public class BaseResponse<T> implements Serializable {
private String code;
private String msg;
private T data;

public String getCode() {
return code;
}

public String getMsg() {
return msg;
}

public T getData() {
return data;
}
}

并制作一个Map函数来解析它:

public static <T> Function<BaseResponse<T>, T> applyUnwrapResponse () {
return new Function<BaseResponse<T>, T>() {
@Override
public T apply(@NonNull BaseResponse<T> baseResponse) throws Exception {
if (baseResponse.getCode().equals(Constants.SUCCESS_CODE)) {
// http returned from server
T data = baseResponse.getData();
if (data == null) {
return null; // throw exception: The mapper function returned a null value
return return new T(); // syntax error
// how ?
}
return data;
} else if (baseResponse.getCode().equals(Constants.USER_NOT_LOGGED_IN)) {
// auth token error
throw new UserNotLoginException(baseResponse.getMsg());
}
// unknown error
throw new UnknownServerException(baseResponse.getMsg());
}
};
}

data 属性不存在时,我尝试返回 null,但这在 Rxjava2 中是不允许的.
在自定义 Observer 中,我在 onNext() 中处理所有 success 场景,因此我需要在 data == null 时发出错误。
但是我不能返回null,也不能通过return new T()返回一个T,怎么办?谁能帮帮我?

最佳答案

几个建议的选项:

  • 由于 Gson 解析器会将空值放入没有数据的字段中,因此您可以返回整个 BaseResponse 对象并检查订阅者/观察者的数据属性对象是否为空。
  • 您可以简单地用一些类似Optional 的接口(interface)包装您的 T 值,它可以有一个值,也可以什么都没有(Java8 Optional 可能不适用于android,但你可以自己想出像 Optional 这样的简单结构),然后在你的 onNext() 上你可以检查你是否有值。

  • RxJava2 有一个名为 Maybe 的新 Observable 类型,它要么发出单个项目 - onSuccess 通知,要么什么都不发出 - onComplete() 通知,(还有错误):

    onSubscribe (onSuccess | onCompleted | onError)?  

    您可以将 flatMapMaybeObservableSingle(来自 Retrofit 服务接口(interface))一起使用,以将一些响应值映射到 Maybe,在 flatMapMaybe 中,您可以使用 Maybe.fromCallable 返回 null,就像您在此处所做的那样,Maybe.fromCallable 将处理返回 null,因为没有发出任何项目,您将获得 onComplete(),因此您可以区分结果情况 (onNext) 和无项目情况 (onComplete ).

关于android - RXjava和Retrofit处理空数据响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43702427/

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