前言
更新RxJava2之后,就不能在onNext里面發(fā)送null值了。但是項(xiàng)目中有些接口拣播,例如發(fā)送手機(jī)驗(yàn)證碼的接口愧杯,后臺(tái)返回過(guò)來(lái)data就為null涎才。我將請(qǐng)求結(jié)果再次進(jìn)行了一次包裝,解決此問(wèn)題力九,便在這記錄下來(lái)耍铜。
正題
解決思路很簡(jiǎn)單,先將返回結(jié)果放入另一個(gè)對(duì)象中跌前,讓它可以成功發(fā)送出去棕兼,最后在回調(diào)方法中從此對(duì)象中去獲取返回結(jié)果。
首先提供一個(gè)包裝返回結(jié)果的類:Optional
public class Optional<M> {
private final M optional; // 接收到的返回結(jié)果
public Optional(@Nullable M optional) {
this.optional = optional;
}
// 判斷返回結(jié)果是否為null
public boolean isEmpty() {
return this.optional == null;
}
// 獲取不能為null的返回結(jié)果抵乓,如果為null伴挚,直接拋異常靶衍,經(jīng)過(guò)二次封裝之后,這個(gè)異常最終可以在走向RxJava的onError()
public M get() {
if (optional == null) {
throw new NoSuchElementException("No value present");
}
return optional;
}
// 獲取可以為null的返回結(jié)果
public M getIncludeNull() {
return optional;
}
}
現(xiàn)在已經(jīng)可以將返回結(jié)果包裝起來(lái)茎芋,然后就可以將這個(gè)包裝后的對(duì)象發(fā)送出去颅眶,我的封裝代碼是:
/**
* http請(qǐng)求結(jié)果處理方法
*
* @param <T>
* @return
*/
public static <T> ObservableTransformer<RESTResult<T>, Optional<T>> handle_result() {
return upstream -> upstream
.flatMap(new Function<RESTResult<T>, ObservableSource<Optional<T>>>() {
@Override
public ObservableSource<Optional<T>> apply(@NonNull RESTResult<T> result) throws Exception {
if (result.status == RESTResult.SUCCESS) {
// result.transform() 就是將返回結(jié)果進(jìn)行包裝
return createHttpData(result.transform());
} else if (result.status == RESTResult.SIGN_OUT) {
// 登錄失效邏輯處理
// ...
} else {
// 發(fā)送請(qǐng)求失敗的信息
String msg = result.message;
return Observable.error(new RxException(msg));
}
return Observable.empty();
}
}
);
}
private static <T> Observable<Optional<T>> createHttpData(Optional<T> t) {
return Observable.create(e -> {
try {
e.onNext(t);
e.onComplete();
} catch (Exception exc) {
e.onError(exc);
}
});
}
最后只需要通過(guò)optional.get()或者optional.getIncludeNull()就可以得到請(qǐng)求結(jié)果。