浅谈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中的代码会非常的冗余,所有的网络请求,页面更新,全部混杂在一起,缺点就是一个类中代码非常多,维护起来非常麻烦。

浅谈Android Rxjava + Retrofit + MVP 框架模式_第1张图片

图为mvc逻辑图,由此可见v与c的界限不是很清楚,混杂在一起。

mvp:m即model ,v为view,p为presenter,mvp模式中引入了presneter的概念。先看一下mvp的逻辑图:

浅谈Android Rxjava + Retrofit + MVP 框架模式_第2张图片

由此可见,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.

3).call对象调用enqueue传入回调接口callBack就完成了整个网络请求接口

4.Retrofit与Rxjava结合

上面说到,retrofit对象调用create方法后就会初始化API接口。API接口的返回值是Call对象,现在我们让他返回的是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

你可能感兴趣的:(浅谈Android Rxjava + Retrofit + MVP 框架模式)