美文网首页
Retrofit+Rxjava在MVPArms中的简单使用

Retrofit+Rxjava在MVPArms中的简单使用

作者: 番茄tomato | 来源:发表于2019-08-15 18:15 被阅读0次

    MVPArms
    https://github.com/JessYanCoding/MVPArms/wiki
    参考资料:(后边两个比较好理解)
    https://www.jianshu.com/p/0fda3132cf98
    https://www.jianshu.com/p/89ce9bf53073
    https://blog.csdn.net/carson_ho/article/details/73732076
    Retrofit网络请求参数注解:
    https://blog.csdn.net/xzytl60937234/article/details/84531386
    https://www.jianshu.com/p/6f80fe0e85cc
    良心api接口 用于练习demo:
    https://www.jianshu.com/p/e6f072839282

    首先给出使用retrofit基本步骤:
    步骤1:添加Retrofit库的依赖
    步骤2:创建 接收服务器返回数据 的类 依据服务器返回的JSON数据建立实体
    步骤3:创建 用于描述网络请求 的接口
    步骤4:创建 Retrofit 实例
    步骤5:创建 网络请求接口实例 并 配置网络请求参数
    步骤6:发送网络请求(异步 / 同步)
    我们一步步来:
    首先要进行网络请求,肯定得有api接口呀,我直接用了上边给出的良心api接口的第一个【新实时段子】用于做demo。
    我们要发出GET请求,Curl是:
    https://api.apiopen.top/getJoke?page=1&count=10&type=image

    点开看看返回的json数据:

    {"code":200,"message":"成功!","result":[{"sid":"29708562","text":"一眼能将别人安排的明明白白,现在像这么优秀的的老板还真不少!","type":"video","thumbnail":"http://wimg.spriteapp.cn/picture/2019/0814/5d5379880d670_wpd.jpg","video":"http://uvideo.spriteapp.cn/video/2019/0814/5d5379880d670_wpd.mp4","images":null,"up":"86","down":"8","forward":"0","comment":"6","uid":"17904743","name":"石榴熟了","header":"http://wimg.spriteapp.cn/profile/20180903115500567894.jpg","top_comments_content":null,"top_comments_voiceuri":null,"top_comments_uid":null,"top_comments_name":null,"top_comments_header":null,"passtime":"2019-08-15 02:56:01"}]}
    

    现在复制,在浏览器输入网址json.cn,在左边黏贴,可以很好的进行数据预览和分析,打开android studio,使用JSON实体类生成工具GsonFormat 生成NewsBean.class,这里没有使用BaseResponse,是我本人不规范,BaseResponse可以数据体content和请求状态分开 简化代码的同时方便统一处理网络层的错误。现在建立一个MVPArms全家桶。然后在api中输入BaseUrl:

    public interface Api {
        //我的app还有一个天气的功能 所以单独给NEWS一个BASEURL
      
        String APP_DOMAIN = "https://www.tianqiapi.com/";
        String NEWS_API="https://api.apiopen.top/getJoke";
    }
    

    建立NewsService接口:

    public interface NewsService {
       //@Headers({"Domain-Name: douban"})
        @GET(NEWS_API)
        Observable<NewsBean> getNews(@Query("page") String page, @Query("count") String count,@Query("type") String type);
    }
    

    在NewsContrract契约类中声明我们要用到的方法:

    public interface NewsContract {
        //对于经常使用的关于UI的方法可以定义到IView中,如显示隐藏进度条,和显示文字消息
        interface View extends IView {
            void showData(NewsBean newsBean);
    //下拉加载更多
            void showMoreData(NewsBean newsBean);
        }
        //Model层定义接口,外部只需关心Model返回的数据,无需关心内部细节,即是否使用缓存
        interface Model extends IModel {
            Observable<NewsBean> getNews(int page,int count);
        }
    }
    

    在NewsModel中实现getNews:

       @Override
        public Observable<NewsBean> getNews(int page, int count) {
            return mRepositoryManager
                    .obtainRetrofitService(NewsService.class)
                    .getNews(String.valueOf(page),String.valueOf(count),"image");
        }
    

    在NewsPresenter中实现getNews:

        @SuppressLint("CheckResult")
        public void getNews(int page, boolean isrefresh){
            RxUtils.apply(mModel.getNews(page,10),mRootView)
                    .subscribe(new Consumer<NewsBean>() {
                        @Override
                        public void accept(NewsBean newsBean) throws Exception {
                            if (isrefresh){//刷新或这第一次加载
                            mRootView.showData(newsBean);}
                            else//上滑加载更多
                            {
                                mRootView.showMoreData(newsBean);
                            } } }); }
    

    这里我在RxUtils中自己重写一个apply方法:

        public static <T> Observable<T> apply(Observable<T> observable,IView mRootView){
            return observable
                    .retryWhen(new RetryWithDelay(3, 2))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
                    .subscribeOn(Schedulers.io())
                    .doOnSubscribe(disposable -> {
                        if (mRootView != null)
                            mRootView.showLoading();
                    })
                    .subscribeOn(AndroidSchedulers.mainThread())
                    .observeOn(AndroidSchedulers.mainThread())
                    .doFinally(()->{
                        if (mRootView != null)
                            mRootView.hideLoading();
                    })
                    .compose(RxLifecycleUtils.bindToLifecycle(mRootView));//使用 Rxlifecycle,使 Disposable 和 Activity 一起销毁
        }
    

    遇到的一个很烦人的问题 http和https
    先看报错java.net.UnknownServiceException: CLEARTEXT communication to *** not permit...
    解决办法:
    https://www.jianshu.com/p/53eeb163b19a
    谷歌最新更新中不允许使用http非加密进行明文传输


    最后就是在NewsActivity中实先showData和showMoreData展示我们的数据啦
    涉及到上拉加载更多和下拉刷新,请移步:
    https://www.jianshu.com/p/0dd105736eaa

    相关文章

      网友评论

          本文标题:Retrofit+Rxjava在MVPArms中的简单使用

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