美文网首页Android知识Android技术知识Android开发经验谈
Rxjava2+Retrofit2结合mvp的简单教程Rxjav

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

作者: MrAllRight_Liu | 来源:发表于2017-08-03 14:09 被阅读803次

    首先我们看一下上一章的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() {
    
                        }
                    });
    
    • 1 第一步把修改返回结果,统一为ResultEntity<T>,然后通过map方法,将ResultEntity<T>转换为T,代码如下
     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);
        }
    
    • 2 第二步解决调用代码过长问题,通过调用代码我们看到,每次一个Observer都要有4个需要实现的方法,然而我们关注的可能就是onnext和onerror,所以我们要封装一个自己的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
        }
    }
    
    • 3 最后我们再来看一下activity中的调用代码,是不是已经很简单了
       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

    相关文章

      网友评论

        本文标题:Rxjava2+Retrofit2结合mvp的简单教程Rxjav

        本文链接:https://www.haomeiwen.com/subject/wikplxtx.html