赞
踩
如期而至的Repository篇,内部实现则由Realm、Retrofit,以及内存级LruCache组成。
Repository,顾名思义,即仓库,向上层屏蔽了数据来源和内部实现细节,不需要了解货物来源,只需要拿走就行了。
由于篇幅问题,将分为上下两篇,本篇主要介绍Retrofit的应用和Repository层组装,下篇会讲解本地缓存(包括Realm和内存缓存)以及基于异常的设计。
首先,为什么我们需要Repository层呢?一言以蔽之,屏蔽细节。
上层(activity/fragment/presenter)不需要知道数据的细节(或者说 - 数据源),来自于网络、数据库,亦或是内存等等。如此,一来上层可以不用关心细节,二来底层可以根据需求修改,不会影响上层,两者的分离用可以帮助协同开发。
举些例子:
- 当现在是无网状态,我希望列表能直接显示上一次的数据,而不会是空页面。
- 除非好友的用户数据过期(比如超过一天),否则希望直接使用本地缓存中的,但如果缓存没有,或者过期,则需要拉取并更新。
- 点赞后,即便请求还没发送或者没有收到response,仍然希望显示点赞后的状态。
等等。
如果这些需求,我们都要实现在View或者Presenter中,就会导致充斥大量数据逻辑,目的不单一,难以维护。而Repository层就是来封装这些逻辑的。
如图,业务层只能看到repository接口。
Retrofit是Android界网红公司Square所开发维护的一个HTTP网络库,目前最新版本是2.0.2(截止2016年4月30日)。其内部使用了自家的OkHttp。
关于Retrofit的实现机制啊简介的,网上已经很多了,这里我就不啰嗦了,官方文档见项目主页。这里主要讲讲实际项目中的应用实践。
root build.gradle:
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:
dependencies {
compile rootProject.ext.libRetrofit
compile rootProject.ext.libRetrofitConverterGson
compile rootProject.ext.libRetrofitAdapterRxJava
compile rootProject.ext.libOkHttpLoggingInterceptor
}
自底向上地,我们需要一个OkHttpClient来设置给Retrofit,这里作为实例,放出一段包含大部分你可能会用到的功能的Client创建代码,可以根据需要进行调整。
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
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
}
};
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。