简述
现在的Android客户端项目中运用RxJava+Retrofit2基本上已经是主流了。
RxJava的优点就不赘述了,对于RxJava还不熟悉的可以在CSDN多找找相关的文章,都写得很好。
如果不对RxJava的Observer二次封装的话,每次新建订阅都要加线程切换,复写方法,比较繁琐。所以我们就有一个二次封装的需求。我将项目中我设计的封装分享出来,至于为什么要这么封装,我在源码里面加注释,相信大家应该能看懂。
代码结构
- 主要封装就在
RxUtil
中,方法都一并注释了。也可参考源码地址。 - 目前使用过程中还没有出现不能满足要求的情况,后续都会一直迭代此封装。
代码文件主要有
RxUtil
package custom.sunday.com.sharedemo.component.rx;
import android.support.annotation.StringRes;
import android.text.TextUtils;
import android.util.Log;
import java.util.List;
import custom.sunday.com.sharedemo.HomeApplication;
import custom.sunday.com.sharedemo.R;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.ObservableTransformer;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
/**
* Created by Administrator on 2017/8/14.
*/
public class RxUtil {
/**
* 线程切换,用一个方法代替,免去手抖打错线程
* */
public static <T> ObservableTransformer<T, T> applySchedulers() {
return new ObservableTransformer<T, T>() {
@Override
public Observable<T> apply(Observable<T> observable) {
return observable.subscribeOn(Schedulers.io()).
observeOn(AndroidSchedulers.mainThread());
}
};
}
/**
* RxJava2.0中不允许发送空指针,所以需要在这里判断如果为空,则发送empty
* 后台格式固定为RootBean
* private String error; //错误码
* private String logID; //调试ID
* private String desc; //详细描述
* private T result; //我们关心的数据
* 我们只对数据感兴趣,所以使用此方法转换Observable只拿result
* */
public static <T> ObservableTransformer<RootBean<T>, T> handleResult() {
return new ObservableTransformer<RootBean<T>, T>() {
@Override
public Observable<T> apply(Observable<RootBean<T>> rootBeanObservable) {
return rootBeanObservable.flatMap(new Function<RootBean<T>, Observable<T>>() {
@Override
public Observable<T> apply(RootBean<T> rootBean) {
if (rootBean.getError().equals(HttpCode.SUCCESS)) {
if (rootBean.getResult() == null) {