使用Google Component构建现代化Android架构
前言
本文受众为2018年的Android开发者,假如你还没有尝试过「观察者模式」的话,本文应该是一个最佳实践的机会。
全文依赖于Google在2017年推出的Google Component组件,它们包括了:
1.ViewModel
2.LiveData
3.Room(本文中使用更强大的ObjectBox替代)
4.Paging(本文中未涉及)
5.LifecycleObserver & LifecycleOwner
(发表于developer.android.com的文章《Guide to App Architecture》 无疑是学习它们的最佳途径。)
本文还涉及到了一些其它的框架组件,它们包括了:
1.Dagger2
2.ObjectBox
3.LeanCloud SDK
4.Glide
旨在解决「依赖注入」、「持久化存储」、「构建服务器并访问」、「图片加载」这四个问题
启发
几天前在学习Dagger2的时候,看到了一篇来自Elye的文章: 《Dagger 2 for Dummies in Kotlin》。
这篇文章让我看到了关注点分离准则(SoC)在技术博客上得到实现。
如果一篇博客希望自己做太多的事情,就会过于冗长,以至于让人失去看下去的勇气,而大多数人看技术博客的目的是仅仅是快速上手。
所以,本文也会试着在使用极少的代码的情况下来阐述如何「使用Google Component构建现代化Android架构」。
安装所需组件
首先,我们要使用Android Studio建立一个包含Kotlin模块的Project,关于如何使用Android Studio建立Kotlin项目请参考互联网中其他文献,此处不再赘述。
第一步:安装kapt编译器插件
kapt编译器插件是Kotlin的注释处理器,我们安装kapt编译器插件后就可以在Kotlin项目中使用Dagger2或Data Binding等依赖于注释的library。
我们在build.gradle中进行配置(后同,不再赘述),配置命令如下:
build.gradle(app)
apply plugin: 'kotlin-kapt'
使用kapt代替annotationProcessor
在安装完kapt编译器插件后,我们需要将build.gradle(app)中dependencies代码块下面的所有"annotationProcessor"使用"kapt"替代,这表示了以后注解这块没有annotationProcessor的事儿了,将全权由kapt代理......
第二步:安装Google Components到项目中
build.gradle(project)
allprojects {
repositories {
jcenter()
google()
}
}
build.gradle(app)
dependencies {
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:1.1.1"
kapt "android.arch.lifecycle:compiler:1.1.1"
// Test helpers for LiveData
testImplementation "android.arch.core:core-testing:1.1.1"
}
第三步:安装Dagger2依赖注入框架
build.gradle(app)
dependencies {
// ... other dependencies ...
implementation 'com.google.dagger:dagger:2.15'
kapt 'com.google.dagger:dagger-compiler:2.15'
}
第四步:安装ObjectBox数据库
build.gradle(project)
buildscript {
dependencies {
// ... other classpath ...
classpath "io.objectbox:objectbox-gradle-plugin:1.5.0"
}
}
build.gradle(app)
apply plugin: 'io.objectbox'
第五步:安装Glide
build.gradle(app)
dependencies {
// ... other dependencies ...
implementation 'com.github.bumptech.glide:glide:4.7.1'
kapt 'com.github.bumptech.glide:compiler:4.7.1'
}
第六步:安装LeanCloud SDK
builde.gradle(project)
别看下面写了一大堆,但是只是添加了两行maven。
buildscript {
repositories {
// ... other repositories ...
maven {
url "http://mvn.leancloud.cn/nexus/content/repositories/public"
}
}
dependencies{
//......
}
}
allprojects {
repositories {
// ... other repositories ...
maven {
url "http://mvn.leancloud.cn/nexus/content/repositories/public"
}
}
}
build.gradle(app)
android {
// ... other android ...
//为了解决部分第三方库重复打包了META-INF的问题
packagingOptions{
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
lintOptions {
abortOnError false
}
}
dependencies {
// ... other dependencies ...
// LeanCloud 基础包
implementation ('cn.leancloud.android:avoscloud-sdk:v4.6.4')
// 推送与实时聊天需要的包
implementation ('cn.leancloud.android:avoscloud-push:v4.6.4@aar'){transitive = true}
// LeanCloud 统计包
implementation ('cn.leancloud.android:avoscloud-statistics:v4.6.4')
// LeanCloud 用户反馈包
implementation ('cn.leancloud.android:avoscloud-feedback:v4.6.4@aar')
// avoscloud-sns:LeanCloud 第三方登录包
implementation ('cn.leancloud.android:avoscloud-sns:v4.6.4@aar')
implementation ('cn.leancloud.android:qq-sdk:1.6.1-leancloud')
// LeanCloud 应用内搜索包
implementation ('cn.leancloud.android:avoscloud-search:v4.6.4@aar')
}
第七步:解决LeanCloud引入后带来的错误
LeanCloud正在使用版本为"18.0.0"的支持包,而我们正在使用版本为"27.1.1"的支持包,所以我们需要在gradle.build(app)中将其统一起来。
android {
// ... other android ...
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '27.1.1'
}
}
}
}
}
本篇结束
本篇结束后,我们把该安装的都安装上了。在下一节中,我们将会学习如何使用LeanCloud构建我们的网络数据库,并使用本节安装的组件从LeanCloud中获取数据并展示在UI中。