RXjava 和 Retrofit 处理空数据响应

Leo*_*eon 3 android rx-java rx-android rx-java2

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

大多数时候,数据响应是这样的格式:

{
  code: 'OK',
  data: {.....}
}
Run Code Online (Sandbox Code Playgroud)

有时,该data属性不存在:

{
  code: 'OK'
}
Run Code Online (Sandbox Code Playgroud)

我上课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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并创建一个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());
            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

data属性不存在时,我尝试 return null,但这在Rxjava2中是不允许的。
在自定义观察者中,我success在 onNext() 中处理所有场景,因此我需要在 时发出错误data == null
但我不能返回 null,也不能返回 by Treturn new T()那么我该怎么办?有人可以帮我吗?

yos*_*riz 5

几个建议的选项:

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

  • RxJava2 有一个名为MaybeObservable的新类型,它要么发出单个项目 -通知,要么什么也不发出 -通知(还有错误):onSuccessonComplete()

    onSubscribe (onSuccess | onCompleted | onError)?  
    
    Run Code Online (Sandbox Code Playgroud)

    您可以与orflatMapMaybe一起使用(从 Retrofit 服务接口),将某些响应值映射到 a ,您可以像在这里一样使用返回 null , 将返回的 null 视为没有发出任何项目,您将得到,因此您可以区分结果情况 ( ) 和无项目情况 ( )。ObservableSingleMaybeflatMapMaybeMaybe.fromCallableMaybe.fromCallableonComplete()onNextonComplete