浅谈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

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
对于Android项目中的网络请求,RxJavaRetrofitMVP是常用的框架组合。下面是一个简单的网络框架封装示例: 首先,在项目中引入RxJavaRetrofit的依赖。 ``` implementation 'io.reactivex.rxjava2:rxjava:2.2.19' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0' ``` 然后,创建一个Retrofit的单例类,用于进行网络请求的初始化和配置。 ```java public class RetrofitClient { private static Retrofit retrofit; private static final String BASE_URL = "https://api.example.com/"; public static Retrofit getClient() { if (retrofit == null) { retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } return retrofit; } } ``` 接下来,创建一个ApiService接口,定义网络请求的方法。 ```java public interface ApiService { @GET("users") Observable<List<User>> getUsers(); } ``` 然后,创建一个DataManager类,用于管理网络请求。 ```java public class DataManager { private ApiService apiService; public DataManager() { apiService = RetrofitClient.getClient().create(ApiService.class); } public Observable<List<User>> getUsers() { return apiService.getUsers(); } } ``` 最后,在MVP的Presenter中调用DataManager类进行网络请求。 ```java public class UserPresenter { private UserView userView; private DataManager dataManager; public UserPresenter(UserView userView) { this.userView = userView; dataManager = new DataManager(); } public void getUsers() { dataManager.getUsers() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<List<User>>() { @Override public void onSubscribe(Disposable d) { // 在请求开始时的操作 } @Override public void onNext(List<User> users) { // 请求成功返回数据时的操作 userView.showUsers(users); } @Override public void onError(Throwable e) { // 请求失败时的操作 userView.showError(e.getMessage()); } @Override public void onComplete() { // 请求完成时的操作 } }); } } ``` 这样,就完成了一个简单的Android RxJava + Retrofit + MVP网络框架封装。你可以根据自己的需要,进行进一步的封装和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值