Android知识Android技术知识Android开发经验谈

Rxjava2+Retrofit2结合mvp的简单教程Rxjav

2017-08-03  本文已影响803人  MrAllRight_Liu

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

                    }
                });
 Observable<ResultEntity<List<GameBean>>> getGameList(@FieldMap Map<String, String> map);//在RetrofitService类修改返回结果

//通过map方法,将结果转换为T,因为我们结果比较简单,所以处理并不复杂,实际情况可能比这复杂多,你可以多用几个操作符一步一步对结果进行处理
  private <T1, T2> void post(Observer<T1> observer, Observable<ResultEntity<T2>> observable) {
        observable.map(new Function<ResultEntity<T2>, T1>() {
            @Override
            public T1 apply(@NonNull ResultEntity<T2> t2ResultEntity) throws Exception {
                return (T1) t2ResultEntity.getInfo();
            }
                    })
                .subscribeOn(Schedulers.io())//指定网络请求在io线程
                .observeOn(AndroidSchedulers.mainThread())//指定返回结果处理在主线程,这样我们就可以在onnext中更新ui了
                .subscribe(observer);
    }
public class BaseObserver<T> implements Observer<T> {
    ResponseListener listener;

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

    public interface ResponseListener<T> {
        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
    }
}
   HttpCenter.getInstance().getGameList(new BaseObserver(new BaseObserver.ResponseListener<List<GameBean>>() {
            @Override
            public void onSuccess(List<GameBean> beanList) {
               tvResult.setText(beanList.get(0).toString());
            }

            @Override
            public void onFail(String error) {

            }
        }), map);
    }

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

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

上一篇 下一篇

猜你喜欢

热点阅读