浅谈Android Rxjava + Retrofit + MVP 框架模式
当下,Rxjava + Retrofit + MVP是Android开发最流行,使用最多的框架了,替代了原来的OKhttp + MVC的模式,但是好处在哪呢。其实Retrofit是在Okhttp的基础上发展而来的网络请求框架,区别不是很大,但是跟RxAndroid配合使用就能发挥其威力了。下面我们就这三方面对比原来的mvc模式进行解析,并结合具体代码来说明。
1.首先我们说一下,mvp与mvc的区别
mvc:m即model,v即view,c为control,也就是我们常说的activity,Fragment。view为我们的布局,经典的mvc模式activity,view的所有逻辑全部写在一起,这样对于小型的项目来说确实一目了然,但是对于大型的项目来说activity中的代码会非常的冗余,所有的网络请求,页面更新,全部混杂在一起,缺点就是一个类中代码非常多,维护起来非常麻烦。
图为mvc逻辑图,由此可见v与c的界限不是很清楚,混杂在一起。
mvp:m即model ,v为view,p为presenter,mvp模式中引入了presneter的概念。先看一下mvp的逻辑图:
由此可见,mvp模式中m与v层不直接交互,引入了presenter,presenter作为中间者,成功的将业务逻辑与页面更新分别开来,m层负责数据拉取,通过p层将数据传递给v层,然后view去更新页面,这样一目了然,对于大型Android项目来说,是再好不过的逻辑了。非常容易维护,也非常容易定位bug的位置,因为页面与网络请求的层级分开处理了。
2.Rxjava与RxAndroid在mvp中的使用
大家都知道,在Android开发中,一些耗时的操作必须放到子线程中,网络请求亦是如此,但是对于view的操作必须放到ui线程中进行,这就需要线程的切换机制了。mvc的时候我们需要大量的handler,还需要new很多的thread,当请求的接口一多的时候,整个代码显得非常的繁杂,代码定位起来也非常的困难。Rxjava其实就是封装的观察者模式,对于Rxjava原理这里不做过多赘述,重点是Rxjava中加入了线程调度系统。可以通过SubscribeOn,ObserverOn随意切换代码执行线程。这就使我们的代码变的更加简洁,不在需要handler,不再需要thread,也不再需要AsyncTask。
3.retrofit网络请求框架
retrofit与okhttp最大的区别就是可以将返回的json数据之间转换为javaBean,或者是map集合,这样会使我们适应接口变化的能力大大提升。
retrofit使用步骤,
1).new 一个OkhttpClient这个与okhttp是一样的,okhttpClient是通过构建者模式进行链式调用的,可以进行连接超时时间设置,差值器设置等
2).new 一个retrofit对象,也是链式调用,然后用retrofit对象creat一个API接口,API接口定义请求方式及地址,API接口返回值为Call<T>.
3).call对象调用enqueue传入回调接口callBack就完成了整个网络请求接口
4.Retrofit与Rxjava结合
上面说到,retrofit对象调用create方法后就会初始化API接口。API接口的返回值是Call<T>对象,现在我们让他返回的是Observable(被观察者对象)。其实retrofit就是为了配个Rxjava而生的。这样我们就可以将retrofit的整个网络请求过程加入到Rxjava的调度中,通过subscribeOn方法指定网络请求的过程在子线程中实现,通过observeOn方法切换到UI线程,再将整个请求过程通过subscribe方法订阅起来。完美。
5.Rxjava 与 Retrofit 与 MVP结合
上面提到,mvp中引入了presenter,presenter中维护model与view,model中进行网络请求,然后在presenter中通过rxjava进行线程切换,再将结果通过view传到activity。model,presenter,view都要通过接口的形式实现,以利于数据的传递。相应的activity实现view接口,实现方法后,就可以得到presenter传过来的数据。然后再进行页面的更新。这样就实现了view,与网络请求的分离,各司其职,activity中只进行关于控件,页面的逻辑修改。
下面我们从demo中看一下整个过程:
在gradle中引入相应的包:
implementation 'com.squareup.retrofit2:retrofit:2.4.0' implementation 'com.squareup.retrofit2:adapter-rxjava:2.4.0' implementation 'com.squareup.retrofit2:converter-gson:2.4.0' implementation 'io.reactivex:rxandroid:1.2.1' implementation 'io.reactivex:rxjava:1.2.7' implementation 'com.squareup.okhttp3:okhttp:3.9.1' implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
新建RetrofitFactory,完成关于retrofit的所有配置
public class RetrofitFactory {
private static RetrofitFactory ourInstance;
public synchronized static RetrofitFactory getInstance() {
if (null == ourInstance) {
synchronized (RetrofitFactory.class) {
if (ourInstance == null) {
ourInstance = new RetrofitFactory();
}
}
}
return ourInstance;
}
/**
* 普通网络访问(包括上传图片)Retrofit
* @param baseUrl url
* @return
*/
public Api getCustomHaierAPi(String baseUrl) {
return getRetrofit(baseUrl).create(Api.class);
}
public Retrofit getRetrofit(String baseUrl) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
// AirLogger.debugE("okhttp",message);
}
});
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10000, TimeUnit.MILLISECONDS)
.addInterceptor(interceptor)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(okHttpClient)
.build();
return retrofit;
}
}
新建view接口,里面定义需要完成的业务逻辑,让activity实现并重写其中的方法。新建model接口,定义业务逻辑方法,新建modelImpl实现model方法,进行网络请求。新建presenter,定义需要完成的方法,新建presenterimpl实现presenter,将model,view维护在presenter中,进行统一调度。在presenterImpl实现的方法中将model的网络请求加入Rxjava的线程调度,返回结果后,将result传入对应的view接口。这样网络请求到的数据就从model中来,通presenter传入了view,然后activity对其进行处理。到这里有人说,怎么需要新建这么多的interface呢,感觉麻烦了呢。其实不需要这么多的interface,interface就是为了进行数据传递,我们可以将我们需要实现的方法写在一个interface中,这样就不需要调一个接口新建一个presenter了。在activity中有选择性的通过presenter去调用相应的方法。
好了,说了这么多,把demo的代码地址发给大家吧。
https://gitee.com/fireqiang/TestMvpDemo.git
上一篇: manacher算法
下一篇: JAVA算法:零钱兑换问题求解
推荐阅读
-
浅谈Android Rxjava + Retrofit + MVP 框架模式
-
Android设计模式之浅谈MVP
-
Android开发:浅谈MVP模式应用与内存泄漏问题解决
-
Android开发:浅谈MVP模式应用与内存泄漏问题解决
-
浅谈Android中的架构模式——MVP(二)
-
Android极封:Retrofit2+RxJava网络请求框架
-
Android框架之MVP模式(以登录为例)
-
Android Retrofit2+rxjava2+Mvp基于okhttp3网络请求框架的使用 一 框架配置
-
Android 搭建MVP+Retrofit+RxJava网络请求框架解析
-
Android 单例模式封装 RxJava+Retrofit 网络请求