![Travis](https://img.shields.io/badge/RxJava2-2.1.1-brightgreen.svg) ![Travis](https://img.shields.io/badge/Retrofit2-2.3.0-ff69b4.svg) ![Travis](https://img.shields.io/badge/compileSdkVersion-25-blue.svg)
### [CSDN博客地址](http://blog.csdn.net/a_zhon/article/details/77914012)
> *许多不管怎么做、怎么想都没结果的事,要懂得交给时间。有些事无论你怎么努力怎么勉强,时间不够,还是耐心的等待吧。*
### 1.序言
> 2016年安卓热门词汇MVP,RxJava,Retrofit。时隔一年这些框架依然是很常用的,现在来把这几个关键词整合起来,搭建一个快速开发框架。。。
----------
### MVP???
对于一些刚学安卓的朋友们应该还不是太熟悉,我们先来温习一下吧!
![这里写图片描述](https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/c0=baike80,5,5,80,26/sign=0d3000fa9c25bc313f5009ca3fb6e6d4/8b82b9014a90f603534849733c12b31bb051ed0e.jpg)
这张图可以说是看烂了,这张图对于懂了点MVP的人可以说是把中间几个字去掉,都能一眼看穿。这张图到底是什么意思呢?
----------
#### 举个例子:
**需求:需要点击一个按钮通过访问网络获取一条数据展示在页面上**
**普通做法:**
一个Activity中写一个方法访问网络获取数据,点击按钮调用它,然后获取数据完成了再拿到对应的控件设置数据,完事了。。。
**MVP:**
在图中有三个模块**view(界面),presenter(控制层),model(数据源)**。他们在这个需求中需要做什么呢?
**view(界面)**:显示数据
**presenter(控制层)**:1.通知model我要取数据 2.取到了数据再传递给view
**model(数据源)**:访问网络获取数据
它的过程是这样的,
> 1. view告诉presenter我要数据
> 2. presenter告诉model我要数据
> 3. model访问网络得到了数据再通知presenter给你我取到的数据
> 4. presenter **处理好数据** 再把数据传递给view
> 5. 最后view显示出来用户可以观看。
有些人说这不是脱了裤子放屁啊?一点代码能写完的东西为啥分了这么多东西?
这确实有点复杂,在面向对象中有几个原则 单一职责原则,开闭原则,里氏代换原则,依赖倒转原则,接口隔离原则,合成复用原则,迪米特法则。这我就不一一介绍了,自行百度。。普通做法中一个Activity即有访问网络,又有更新界面,第一条单一职责原则就违背了,然而在mvp中view只做和界面相关的事情。
再者一个Activity中如果逻辑太多了。一个Activity几千行代码,逻辑判断,更新界面,查询数据库,访问网络,如果第二个人需要修改,怎么看??
这时候再看看mvp 逻辑在P里面一个类,数据在Model层,界面相关的在V层。清晰明了,也方便单元测试。
> 程序猿如果不最求代码质量,那和咸鱼有什么区别?
### RxJava2+Retrofit2整合
#### 1.玩框架第一步compile :
```
compile 'io.reactivex.rxjava2:rxjava:2.1.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:converter-scalars:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'//配合rxjava2
compile 'com.squareup.okhttp3:logging-interceptor:3.8.1'//拦截器
```
#### 2.创建service
```
public interface RequestService {
String BASE_URL = "https://news-at.zhihu.com/api/4/";
/**
* 测试接口
*
* @return
*/
@GET("news/latest")
Observable<TestBean> test();
}
```
> 单独使用retrofit是返回call,配合RxJava这里我们返回Observable
#### 3.封装一个工具类
```
public class RetrofitFactory {
//访问超时
private static final long TIMEOUT = 30;
// Retrofit是基于OkHttpClient的,可以创建一个OkHttpClient进行一些配置
private static OkHttpClient httpClient = new OkHttpClient.Builder()
//打印接口信息,方便接口调试
.addInterceptor(new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.e("TAG", "log: " + message);
}
}).setLevel(HttpLoggingInterceptor.Level.BASIC))
.connectTimeout(TIMEOUT, TimeUnit.SECONDS)
.readTimeout(TIMEOUT, TimeUnit.SECONDS)
.build();
private static RetrofitService retrofitService = new Retrofit.Builder()
.baseUrl(RetrofitService.BASE_URL)
// 添加Gson转换器
.addConverterFactory(GsonConverterFactory.create(new GsonBuilder()
.setLenient()
.create()
))
// 添加Retrofit到RxJava的转换器
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(httpClient)
.build()
.create(RetrofitService.class);
//获得RetrofitService对象
public static RetrofitService getInstance() {
return retrofitService;
}
}
```
#### 使用
我们整合好了,最后我们看下怎么使用吧!访问个网络获取一个数据
```
RetrofitFactory.getInstance()//获取retrofitService对象
.test()//测试接口
.subscribeOn(Schedulers.io())
.doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(@NonNull Disposable disposable) throws Exception {
//将这个请求的Disposable添加进入CompositeDisposable同一管理(在封装的presenter中)
addDisposable(disposable);
//访问网络显示dialog
view.showLoadingDialog("");
}
})
.map(new Function<TestBean, List<TestBean.StoriesBean>>() {
@Override
public List<TestBean.StoriesBean> apply(@NonNull TestBean testBean) throws Exception {
//转化数据
return testBean.getStories();
}
})
//获得的数据返回主线程去更新界面
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<TestBean.StoriesBean>>() {
@Override
public void accept(@NonNull List<TestBean.StoriesBean> storiesBeen) throws Exception {
//消失dialog
view.dismissLoadingDialog();
//设置数据
view.setData(storiesBeen);
}
}, new Consumer<Throwable>() {
@Override
public void accept(@NonNull Throwable throwable) throws Exception {
view.dismissLoadingDialog();
String exception = ExceptionHelper.handleException(throwable);
//打印出错误信息
Log.e("TAG", "exception: " + exception);
}
});
```
好我们来分析一下,
> 1. 首先先获得一个retrofitService对象
> 2. 然后调用test接口。
> 3. 访问网络在子线程
> 4. 在访问网络的时候显示等待对话框,将这个请求加入CompositeDisposable中(在basePresenter封装了统一管理的方法,调用addDisposable(disposable);最后Activity关闭,取消所有网络请求,防止内存泄漏)
> 5. 将网络获取的数据转换成你需要的数据
> 6. 线程卡点结果返回主线程
> 7. 订阅得到数据更新界面,处理错误信息
RxJava2+retrofit2就是这么简单封装好了一条线路下来非常
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Mvp-RxJava-Retrofit-master.zip (71个子文件)
Mvp-RxJava-Retrofit-master
.gitignore 118B
gradle
wrapper
gradle-wrapper.jar 52KB
gradle-wrapper.properties 232B
screenCapture
img_01.png 38KB
README.md 16KB
build.gradle 498B
gradlew.bat 2KB
gradlew 5KB
app
.gitignore 7B
build.gradle 1KB
proguard-rules.pro 916B
src
test
java
com
zhon
frame
ExampleUnitTest.java 392B
main
AndroidManifest.xml 882B
java
com
zhon
frame
mvp
test
bean
TestBean.java 3KB
contact
TestContact.java 749B
presenter
TestPresenter.java 2KB
adapter
TestAdapter.java 2KB
activity
TestActivity.java 2KB
utils
ScreenSizeUtils.java 1KB
SharePreUtils.java 5KB
model
RetrofitService.java 540B
Api.java 554B
RootActivity.java 669B
res
values
styles.xml 383B
colors.xml 208B
strings.xml 72B
mipmap-xxhdpi
ic_launcher_round.png 10KB
ic_launcher.png 8KB
layout
item_test.xml 2KB
activity_test.xml 419B
activity_root.xml 241B
mipmap-xhdpi
ic_launcher_round.png 6KB
ic_launcher.png 5KB
mipmap-hdpi
ic_launcher_round.png 4KB
ic_launcher.png 3KB
drawable
logo.png 196KB
mipmap-mdpi
ic_launcher_round.png 2KB
ic_launcher.png 2KB
mipmap-xxxhdpi
ic_launcher_round.png 14KB
ic_launcher.png 10KB
androidTest
java
com
zhon
frame
ExampleInstrumentedTest.java 732B
BaseLib
.gitignore 7B
build.gradle 1KB
proguard-rules.pro 916B
src
test
java
com
zhon
baselib
ExampleUnitTest.java 394B
main
AndroidManifest.xml 247B
java
com
zhon
baselib
mvpbase
baseImpl
BaseActivity.java 2KB
BaseFragment.java 2KB
BasePresenterImpl.java 2KB
BaseBean.java 791B
BasePresenter.java 607B
BaseView.java 317B
utils
ActivityManager.java 3KB
retroft
BaseApi.java 518B
ApiException.java 546B
ExceptionHelper.java 2KB
BaseApiImpl.java 3KB
res
values
strings.xml 70B
androidTest
java
com
zhon
baselib
ExampleInstrumentedTest.java 741B
Mvp-RxJava-Retrofit 863B
gradle.properties 730B
.idea
runConfigurations.xml 564B
encodings.xml 159B
vcs.xml 180B
misc.xml 7KB
modules.xml 589B
copyright
profiles_settings.xml 74B
compiler.xml 686B
gradle.xml 679B
markdown-navigator
profiles_settings.xml 104B
settings.gradle 27B
共 71 条
- 1
资源评论
- 我该叫什么名字好呢?2018-07-25如果一个页面有多个请求 这个该如何实现呀如果一个页面有多个请求 这个该如何实现呀如果一个页面有多个请求 这个该如何实现呀
- qq_149086832018-08-24还是可以的
- 打酱油的日光灯2018-06-15如果一个页面有多个请求 这个该如何实现呀
离群羊
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功