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 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 getNews(int page,int count);
}
}
在NewsModel中实现getNews:
@Override
public Observable 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() {
@Override
public void accept(NewsBean newsBean) throws Exception {
if (isrefresh){//刷新或这第一次加载
mRootView.showData(newsBean);}
else//上滑加载更多
{
mRootView.showMoreData(newsBean);
} } }); }
这里我在RxUtils中自己重写一个apply方法:
public static Observable apply(Observable 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