Retrofit+Rxjava在MVPArms中的简单使用

2019-08-15  本文已影响0人  番茄tomato

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

上一篇下一篇

猜你喜欢

热点阅读