使用Retrofit2.0+RxJava+MVP构建项目框架

项目背景

Retrofit2.0+RxJava+MVP是当前比较流行的一套构建APP的项目框架,尤其是你的APP需要与服务器有频繁的数据交互时,这套框架组合无疑是最佳的选择。接下来简要介绍下这几个库和模式,Retrofit2.0是一个基于Okhttp的网络请求库,RxJava是一个用于异步调用的库,MVP则是一个三层的编程模式。如上所述我们的一个项目中需要频繁的与服务器进行数据交互,最后将数据通过各种控件以列表文字或者图表的形式展现出来。与服务器的接口采用的是Rest服务,因此经过多方调研后选择了这套框架,也许代码量会有所增加,但整个项目结构更加清晰,后台数据获取变得简单使得我们有更多时间放在业务逻辑和界面逻辑上。

Retrofit2.0

Retrofit是目前Android或者Java上最优秀的Http Client库,在使用方面也非常简单方便,我们可以用注解的方式来描述Http请求,URL参数的替换和查询参数的支持也自动的整合在一起。另外,它提供了多种多样的Request Body和文件上传,这里简要总结下我的知识经验。Retrofit 2.0是默认利用Okhttp作为它的网络请求层,并在它的基础上进行构建的。因此不必为自己的项目再明确的添加Okhttp的支持,除非你有特别的版本需求。

  1. 在Android Studio中使用Gradle添加Retrofit的支持
    compile 'com.squareup.retrofit2:retrofit:(insert latest version)'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
  2. 持久的Android Http Client,(Service Generator)
    ServiceGenerator是我们http客户端的核心,我们可以在Retrofit中添加Gson的支持,下面是它的基本功能代码。
public class ServiceGenerator{
    public static final String API_BASE_URL="http://your.api_base.url";
    private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
    private static Retrofit.Builder builder = new Retrofit.Builder() 
        .baseUrl(API_BASE_URL) 
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 使用RxJava作为回调适配器
        .addConverterFactory(GsonConverterFactory.create());//使用GSON作为数据转换器
    public static  S createService(Class serviceClass) { 
        Retrofit retrofit = builder.client(httpClient.build()).build(); 
        return retrofit.create(serviceClass); }
}

Retrofit2.0 支持GSON作为数据转换库,同时支持RxJava作为回调适配器。因此在编写网络调用接口API时,只需要将Retrofit2.0通常的返回类型Call转化为RxJava中的被订阅者Observable即可,API调用接口如下所示:

public interface getEnvironmentData{
        @FormUrlEncoded
        @post("envir/rest");
        Observable loadEnvirData(
            @Field("airtemp") String airtemp
            ...
        );
}

这样我们完成了一个基本的Retrofit Client同时添加了RxJava的支持,关于Retrofit的详细使用将在接下来的文章中一系列的总结。

RxJava

A library for composing asynchronous and event-based programs using observable sequences for the Java VM(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库),其实, RxJava 的本质可以压缩为异步这一个词。说到根上,它就是一个实现异步操作的库,而别的定语都是基于这之上的。RxJava 的异步实现,是通过一种扩展的观察者模式来实现的。
RxJava 有四个基本概念:Observable(可观察者,即被观察者)、Observer(观察者)、subscribe(订阅)、事件。Observable和Observer通过subscribe()方法实现订阅关系,从而Observable可以在需要的时候发出事件来通知Observer。与传统观察者模式不同, RxJava 的事件回调方法除了普通事件onNext()(相当于onClick()/onEvent())之外,还定义了两个特殊的事件:onCompleted()和onError()。subscribe()还支持不完整定义的回调,RxJava 会自动根据定义创建出Subscriber 。同时RxJava中有个Subscription接口用来取消订阅。如何得到一个Subscription对象呢,其实Observable.subscribe()方法可以返回一个Subscription的对象,即我们每次订阅都会返回. Subscription就像一个订单,你下单了就会生成一个订单,而你也可以用这个订单取消订单.
综上所述,我们将RxJava融入到了Retrofit中,接下来使用MVP模式将三者结合在一起。

MVP

随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责。为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Model只关系数据的处理,基于MVC概念的MVP(Model-View-Presenter)模式应运而生。
使用MVP模式会使整个项目结构更加清晰,降低代码的耦合度,但同时也增加了许多代码量和学习成本,MVP模式中Model层负责处理数据,View层负责界面逻辑处理,Presenter层负责Model层和View层的数据交互。
View不直接与Model交互,而是通过与Presenter交互来与Model间接交互Presenter与View的交互是通过接口来进行的,更有利于添加单元测试通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑。
Model层用来获取Retrofit2.0获取的数据,数据被直接封装进了RxJava中的Observer中。

public class RealTimeEnvirDataModelImpl implements RealTimeEnvirDataModel{
        public Observable loadRealTimeEnvirData(...){
            return ServiceGenerator.createService(getEnvironmentData.class).loadEnvirData(...);
        }
} 

View层实现Android界面逻辑代码,主要用来实现数据的UI展示接口,在UI界面实现该接口就好。

public interface RealTimeEnvirDataView extends BaseView{
        void displayRealTimeData(EnvirDataForm envirDataForm);
}

Presenter层实现Model层和View层的数据交互,主要代码如下所示:

public class RealTimeEnvirDataPresenterImpl implements RealTimeEnvirDataPresenter{
        private RealTimeEnvirDataModel mRealTimeEnvirDataModel ;
        private RealTimeEnvirDataView mRealTimeEnvirDataView ;
        private Subscription mSubscription;
        //将RealTimeEnvirDataView 传入构造函数
        public RealTimeEnvirDataPresenterImpl (RealTimeEnvirDataView  mRealTimeEnvirDataView ){
            this.mRealTimeEnvirDataView =mRealTimeEnvirDataView ;
            mRealTimeEnvirDataModel =new RealTimeEnvirDataModelImpl();
        }
        
        public void loadRealTimeEnvirData(...){
            ...
            mSubscription=mRealTimeEnvirDataModel .loadRealTimeEnvirData(...)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers,mainThread())
            .subscribe(new Action1(){
                public void call(EnvirDataForm envirDataForm){
                    mRealTimeEnvirDataView .displayRealTimeData(nvirDataForm);
                    ...
                }
            },new Action1(){
                public void call(Throwable throwable){
                    ...
                }
            });
        }
        ....
        //其他操作,取消或者销毁时操作,取消订阅,隐藏进度条等。
        ...
}

这里简要总结了Retrofit2.0+RxJava+MVP的架构模式,之后会在别的文章里详细总结其中的使用方法。

你可能感兴趣的:(使用Retrofit2.0+RxJava+MVP构建项目框架)