Rxjava2+Retrofit2结合mvp的简单教程Rxjava篇(二):Rxjava的简单封装


首先我们看一下上一章的rxjava的调用代码如下,可以看到代码很长,如果每个请求都是这么长肯定不行,其次是返回结果没有转换到bean类,下面我们就从这两面来进行封装
    HttpCenter.getInstance().service.getGameList(map)
                .subscribeOn(Schedulers.io())//指定网络请求在io线程
                .observeOn(AndroidSchedulers.mainThread())//指定返回结果处理在主线程,这样我们就可以在onnext中更新ui了
                .subscribe(new Observer() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {

                    }

                    @Override
                    public void onNext(@NonNull ResponseBody responseBody) {
                        try {
                            tvResult.setText(responseBody.string());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
  • 1 第一步把修改返回结果,统一为ResultEntity,然后通过map方法,将ResultEntity转换为T,代码如下
 Observable>> getGameList(@FieldMap Map map);//在RetrofitService类修改返回结果

//通过map方法,将结果转换为T,因为我们结果比较简单,所以处理并不复杂,实际情况可能比这复杂多,你可以多用几个操作符一步一步对结果进行处理
  private  void post(Observer observer, Observable> observable) {
        observable.map(new Function, T1>() {
            @Override
            public T1 apply(@NonNull ResultEntity t2ResultEntity) throws Exception {
                return (T1) t2ResultEntity.getInfo();
            }
                    })
                .subscribeOn(Schedulers.io())//指定网络请求在io线程
                .observeOn(AndroidSchedulers.mainThread())//指定返回结果处理在主线程,这样我们就可以在onnext中更新ui了
                .subscribe(observer);
    }
  • 2 第二步解决调用代码过长问题,通过调用代码我们看到,每次一个Observer都要有4个需要实现的方法,然而我们关注的可能就是onnext和onerror,所以我们要封装一个自己的Observer类,代码如下
public class BaseObserver implements Observer {
    ResponseListener listener;

    public BaseObserver(ResponseListener listener) {
        this.listener = listener;
    }

    public interface ResponseListener {
        void onSuccess(T t);
        void onFail(String error);
    }
    @Override
    public void onSubscribe(@NonNull Disposable d) {
     //这里以后可以启动loading
    }

    @Override
    public void onNext(@NonNull T t) {
        listener.onSuccess(t);
    }

    @Override
    public void onError(@NonNull Throwable e) {
        listener.onFail(e.getMessage());
    }

    @Override
    public void onComplete() {
      //关闭loading
    }
}
  • 3 最后我们再来看一下activity中的调用代码,是不是已经很简单了
   HttpCenter.getInstance().getGameList(new BaseObserver(new BaseObserver.ResponseListener>() {
            @Override
            public void onSuccess(List beanList) {
               tvResult.setText(beanList.get(0).toString());
            }

            @Override
            public void onFail(String error) {

            }
        }), map);
    }

最后说一下,实际项目的情况处理比这要复杂的多,首先是网络加载的时候要有loading提示,其次返回结果复杂要一步步做处理,还有添加header,拦截器或者自己的gson转换库,需要读者自己去琢磨琢磨

本篇代码均已上传:https://github.com/MrAllRight/HttpExample

你可能感兴趣的:(Rxjava2+Retrofit2结合mvp的简单教程Rxjava篇(二):Rxjava的简单封装)