当前位置:   article > 正文

从零开始的Android新项目5 - Repository层(上)_android repository

android repository

如期而至的Repository篇,内部实现则由Realm、Retrofit,以及内存级LruCache组成。
Repository,顾名思义,即仓库,向上层屏蔽了数据来源和内部实现细节,不需要了解货物来源,只需要拿走就行了。

由于篇幅问题,将分为上下两篇,本篇主要介绍Retrofit的应用和Repository层组装,下篇会讲解本地缓存(包括Realm和内存缓存)以及基于异常的设计。

Why Repository

首先,为什么我们需要Repository层呢?一言以蔽之,屏蔽细节。

上层(activity/fragment/presenter)不需要知道数据的细节(或者说 - 数据源),来自于网络、数据库,亦或是内存等等。如此,一来上层可以不用关心细节,二来底层可以根据需求修改,不会影响上层,两者的分离用可以帮助协同开发。

举些例子:
- 当现在是无网状态,我希望列表能直接显示上一次的数据,而不会是空页面。
- 除非好友的用户数据过期(比如超过一天),否则希望直接使用本地缓存中的,但如果缓存没有,或者过期,则需要拉取并更新。
- 点赞后,即便请求还没发送或者没有收到response,仍然希望显示点赞后的状态。
等等。

如果这些需求,我们都要实现在View或者Presenter中,就会导致充斥大量数据逻辑,目的不单一,难以维护。而Repository层就是来封装这些逻辑的。

Overview

如图,业务层只能看到repository接口。

Repository Overview

Retrofit

Retrofit是Android界网红公司Square所开发维护的一个HTTP网络库,目前最新版本是2.0.2(截止2016年4月30日)。其内部使用了自家的OkHttp

关于Retrofit的实现机制啊简介的,网上已经很多了,这里我就不啰嗦了,官方文档见项目主页。这里主要讲讲实际项目中的应用实践。

import

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}"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

repository module的build.gradle:

dependencies {
    compile rootProject.ext.libRetrofit
    compile rootProject.ext.libRetrofitConverterGson
    compile rootProject.ext.libRetrofitAdapterRxJava
    compile rootProject.ext.libOkHttpLoggingInterceptor
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

OkHttpClient

自底向上地,我们需要一个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[]{};
                    }
                }
        };

        
  • 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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/311565
推荐阅读
相关标签
  

闽ICP备14008679号