本系列:
- 《从零开始的Android新项目(1):架构搭建篇》
- 《从零开始的Android新项目(2):Gradle 篇》
- 《从零开始的Android新项目(3):谁告诉你MVP和MVVM是互斥的》
- 《从零开始的Android新项目(4):Dagger2 篇》
如期而至的Repository篇,内部实现则由Realm、Retrofit,以及内存级LruCache组成。
Repository,顾名思义,即仓库,向上层屏蔽了数据来源和内部实现细节,不需要了解货物来源,只需要拿走就行了。
由于篇幅问题,将分为上下两篇,本篇主要介绍Retrofit的应用和Repository层组装,下篇会讲解本地缓存(包括Realm和内存缓存)以及基于异常的设计。
Why Repository
首先,为什么我们需要Repository层呢?一言以蔽之,屏蔽细节。
上层(activity/fragment/presenter)不需要知道数据的细节(或者说 – 数据源),来自于网络、数据库,亦或是内存等等。如此,一来上层可以不用关心细节,二来底层可以根据需求修改,不会影响上层,两者的分离用可以帮助协同开发。
举些例子:
- 当现在是无网状态,我希望列表能直接显示上一次的数据,而不会是空页面。
- 除非好友的用户数据过期(比如超过一天),否则希望直接使用本地缓存中的,但如果缓存没有,或者过期,则需要拉取并更新。
- 点赞后,即便请求还没发送或者没有收到response,仍然希望显示点赞后的状态。
等等。
如果这些需求,我们都要实现在View或者Presenter中,就会导致充斥大量数据逻辑,目的不单一,难以维护。而Repository层就是来封装这些逻辑的。
Overview
如图,业务层只能看到repository接口。
Retrofit
Retrofit是Android界网红公司Square所开发维护的一个HTTP网络库,目前最新版本是2.0.2(截止2016年4月30日)。其内部使用了自家的OkHttp。
关于Retrofit的实现机制啊简介的,网上已经很多了,这里我就不啰嗦了,官方文档见项目主页。这里主要讲讲实际项目中的应用实践。
import
root build.gradle:
1 2 3 4 5 6 7 8 9 |
def retrofitVersion = "2.0.2" def okHttpVersion = '3.2.0' project.ext { libRetrofit = "com.squareup.retrofit2:retrofit:${retrofitVersion}" libRetrofitConverterGson = "com.squareup.retrofit2:converter-gson:${retrofitVersion}" libRetrofitAdapterRxJava = "com.squareup.retrofit2:adapter-rxjava:${retrofitVersion}" libOkHttpLoggingInterceptor = "com.squareup.okhttp3:logging-interceptor:${okHttpVersion}" } |
repository module的build.gradle:
1 2 3 4 5 6 |
dependencies { compile rootProject.ext.libRetrofit compile rootProject.ext.libRetrofitConverterGson compile rootProject.ext.libRetrofitAdapterRxJava compile rootProject.ext.libOkHttpLoggingInterceptor } |
OkHttpClient
自底向上地,我们需要一个OkHttpClient来设置给Retrofit,这里作为实例,放出一段包含大部分你可能会用到的功能的Client创建代码,可以根据需要进行调整。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
private OkHttpClient getClient() { // log用拦截器 HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); // 开发模式记录整个body,否则只记录基本信息如返回200,http协议版本等 if (IS_DEV) { logging.setLevel(HttpLoggingInterceptor.Level.BODY); } else { logging.setLevel(HttpLoggingInterceptor.Level.BASIC); } // 如果使用到HTTPS,我们需要创建SSLSocketFactory,并设置到client SSLSocketFactory sslSocketFactory = null; try { // 这里直接创建一个不做证书串验证的TrustManager final TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override ێ零开始的Android新项目(1):架构搭建篇》
如期而至的Repository篇,内部实现则由Realm、Retrofit,以及内存级LruCache组成。 Repository,顾名思义,即仓库,向上层屏蔽了数据来源和内部实现细节,不需要了解货物来源,只需要拿走就行了。 由于篇幅问题,将分为上下两篇,本篇主要介绍Retrofit的应用和Repository层组装,下篇会讲解本地缓存(包括Realm和内存缓存)以及基于异常的设计。 Why Repository首先,为什么我们需要Repository层呢?一言以蔽之,屏蔽细节。 上层(activity/fragment/presenter)不需要知道数据的细节(或者说 – 数据源),来自于网络、数据库,亦或是内存等等。如此,一来上层可以不用关心细节,二来底层可以根据需求修改,不会影响上层,两者的分离用可以帮助协同开发。 举些例子:
如果这些需求,我们都要实现在View或者Presenter中,就会导致充斥大量数据逻辑,目的不单一,难以维护。而Repository层就是来封装这些逻辑的。 Overview如图,业务层只能看到repository接口。 RetrofitRetrofit是Android界网红公司Square所开发维护的一个HTTP网络库,目前最新版本是2.0.2(截止2016年4月30日)。其内部使用了自家的OkHttp。 关于Retrofit的实现机制啊简介的,网上已经很多了,这里我就不啰嗦了,官方文档见项目主页。这里主要讲讲实际项目中的应用实践。 importroot build.gradle:
repository module的build.gradle:
OkHttpClient自底向上地,我们需要一个OkHttpClient来设置给Retrofit,这里作为实例,放出一段包含大部分你可能会用到的功能的Client创建代码,可以根据需要进行调整。
|