Retrofit+Rxjava在MVPArms中的简单使用

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343