Android轻松搭建MVP + Retrofit + RxJava(MR篇)

上周给大家分享带来了一篇很实用的UI实战的文章( Android实现列表抽屉展示效果),接下来我想用一周的时间用大概两篇文章的内容和大家分享关于MVP + Retrofit + RxJava架构模型(思路和demo正在整理中...)
关于什么是MVP,什么是Retrofit,什么是RxJava的问题,网上很多优秀的博客已经介绍的很详细了,我想以框架之间的关系以及运行的流程为主要方面来和大家分享如何一步步的实现整体的框架内容。如果你还不清楚什么是MVP,什么是Retrofit,什么是RxJava,下面我也会列举几个比较优秀的博客仅空参考哈,所以本系列的内容还是比较适合对MVP,Retrofit,RxJava有了解的朋友。
下面向大家分享一些比较优秀的文章,还不了解的朋友可以先看这里:
(1)MVP:
         Android的MVP设计模式
         选择恐惧症的福音!教你认清 MVC,MVP 和 MVVM
(2)Retrofit:
         Android 你必须了解的网络框架Retrofit2.0
        【Bugly 干货分享】深入浅出 Retrofit,这么牛逼的框架你们还不来看看?
        使用Retrofit2.0+OkHttp3.0实现缓存处理
(3)RxJava:
        关于RxJava最友好的文章
        关于RxJava最友好的文章(进阶)

准备工作:
1.引用
Android轻松搭建MVP + Retrofit + RxJava(MR篇)_第1张图片
注:Retrofit中已经包含了OkHttp,所以不需要我们再单独引用。

2.在AndroidManifest.xml添加网络权限

<uses-permission android:name="android.permission.INTERNET" />
一、MVP
(1)先来看MVP的搭建模式:
      
上面是以项目首页来说,分成了model、presenter、view三层,即对应MVP。关于每层的内容就不再多说了。
可以看到我上面是以内容模块来划分项目工程的,而不是以功能模块划分。这样的特点是内容模块聚合性强,并且更个模块独立分开,清晰。
为什么要先说MVP呢,因为模块划分的不同,会影响Retrofit创建api Service的方式不同。我大致分成如下两种方式:
(1)全局Retrofit ApiService。
(2)内容模块下独立创建model,并在model中创建apiService。
下面我们来看第一种实现方式:
(1)全局ApiService:
Android轻松搭建MVP + Retrofit + RxJava(MR篇)_第2张图片
大家都知道在使用Retrofit的时候需要我们去create一个接口服务类,全局APIService的意思就是创建一个全局的接口服务类,将所有的服务请求方法放在里面,例如上图所示。我们将其称为全局服务类。
2.然后我们可以创建一个Retrofit工具类(ApiRetrofit)进行Retrofit的初始化工作:

Android轻松搭建MVP + Retrofit + RxJava(MR篇)_第3张图片
我去,右下角是什么!!我不知道~~哈哈
从上图可以看到,我们在ApiRetrofit的构造方法中初始化OkHttp已经Retrofit,最后创建ApiService,并提供一个get方法供我们外部调用,那么在哪去调用呢?
3.为了回答上面的问题,我们可以创建一个单例模式来返回ApiService,可能有朋友说为啥定义成单例呢?别忘了,我们的ApiService是全局的,那么我们就可以在整个工程中使用一个实例即可,也就是定义成单例类:
Android轻松搭建MVP + Retrofit + RxJava(MR篇)_第4张图片
3.ok,在使用Presenter的时候,我们都会去创建一个BasePresenter,然后子类继承。因为是全局ApiService,所以我们就可以在BasePresenter中定义一个静态的ApiService,然后就可以在子类的Presenter都能共同访问了:

上面我们创建了ApiService,然后我们就可以在子类中使用apiService进行服务请求操作了。
(2)按模块创建ApiService
Android轻松搭建MVP + Retrofit + RxJava(MR篇)_第5张图片
从第一种方式中我们看到,定义成全局ApiService,我们就可以在Retrofit初始化时创建ApiService实例,提供get方法返回该实例。然后创建一个单例类通过单例模式返回ApiService,最后在BasePresenter中获取即可。
但是按模块去创建ApiService的方式就不能采用上面的方法了。可想而知,因为每个内容模块都要对应一个ApiService。例如用户信息、首页内容,我们就需要在对应的module下的model文件夹下创建UserApiService、HomeApiService。
这种情景下就不能在Retrofit初始化时去创建ApiService了,因为我们不知道要创建哪个。所以我们将Retrofit封装成一个单例类:
/**
 * Retrofit请求封装
 * Created by Song on 2016/8/30.
 */
public class RetrofitUtils {

    private static Retrofit mRetrofit;
    private static volatile RetrofitUtils instance;
    private static final String APP_BASE_URL = "https://api.douban.com/v2/";

    private RetrofitUtils() {

        mRetrofit = new Retrofit.Builder()
                .client(getOkHttpClient())
                .baseUrl(APP_BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

    public static RetrofitUtils getInstance() {
        if(instance == null) {
            synchronized (RetrofitUtils.class) {
                if(instance == null) {
                    instance = new RetrofitUtils();
                    return instance;
                }
            }
        }
        return instance;
    }
}
可以看到,我们创建了RetrofitUtils工具类,并以单例模式返回。
然后我们就可以在presenter中通过RetrofitUtils来创建ApiService:
public class UserPresenter {

    private apiService apiService;

    public UserPresenter() {
        apiService = RetrofitUtils.getInstance().create(apiService.class);
    }

    public void login(String name, String tag, int start, int count) {

        Call<BookSearchResponse> call = apiService.loadData(name,tag,start,count);
        call.enqueue(new Callback<BookSearchResponse>() {

            @Override
            public void onResponse(Call<BookSearchResponse> call, Response<BookSearchResponse> response) {
                BookSearchResponse bookSearchResponse = response.body();
                Log.d("onResponse", bookSearchResponse.toString());
                //调用viewInterface的回调方法
            }

            @Override
            public void onFailure(Call<BookSearchResponse> call, Throwable t) {
                Log.d("onFailure",t.toString());
                //调用viewInterface的回调方法
            }
        });
    }
}
可以看到,在presenter的构造方法中我们通过RetrofitUtils创建了ApiService,然后在login方法中调用对应请求即可。
到此为止,我们就将Retrofit和MVP成功的结合在一起啦~是不是很简单!最后,我们只需要在Activity中调用就可以了:
Android轻松搭建MVP + Retrofit + RxJava(MR篇)_第6张图片
ok,关于MVP + Retrofit我们就完成了,下一篇文章我将和大家分享如何将RxJava和MVP + Retrofit结合在一起。thks~
源码下载

你可能感兴趣的:(Android)