欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅谈Android Rxjava + Retrofit + MVP 框架模式

程序员文章站 2024-03-16 13:03:52
...

当下,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 框架模式

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

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

浅谈Android Rxjava + Retrofit + 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