使用Kotlin+MVP+AndroidX搭建安卓项目框架

最近深入学习了下kotlin,发现还是挺不错的,特别是其中的协程,改变了以往我对安卓开发使用线程的习惯,这东西用起来方便,省去了使用java而产生的各种回调和主子线程通讯的麻烦,当然如果你习惯了Java,要转kotlin并使用协程改造你的项目,成本还是挺大的。谷歌正在用kotlin逐步取代Java,同时也在用androidx替代android support包,而MVP也是这两年非常流行的设计模式(还有MVVM),为了紧跟潮流,本教程将手把手带你搭建一个基于kotlin+MVP+AndroidX的安卓项目基本框架,同时也可以让新手了解一个项目的搭建过程,如果你正在新做一个项目或者准备重构一个项目,希望本教程能给你些许参考价值。

在此之前,你得对以下知识有一定了解:

1.kotlin(特别是协程,这个百度能找到一大堆文档,这里就不详细赘述了)

2.MVP设计模式(参考我的另一博客:安卓MVP设计模式

实际上MVVM使用协程更方便,Kotlin对架构组件ViewModel提供了很好的支持,但MVVM的例子网上已经有很多了,我这里就来写写MVP上的使用。

别问为什么不用RxJava,问就是不喜欢(加上协程的话改造成本有点大而且不够优雅)。

开发工具:

Android Studio 3.2+(我用的是AS3.5)

一、创建项目

项目创建,基础语言选择kotlin(AS会自动帮你配置好kotlin,同时AS3.5默认使用了AndroidX),由于明确了使用MVP设计模式,所以我把项目结构设计如下:

其中规范可参考:安卓开发规范

二、AndroidX的迁移

谷歌官方有说到SDK 28.0.0版本还是采用android.support,但后续的版本都将采用androidx,因此虽然近期内我们可能没什么影响,但为了适配以后版本的变化,现在就开始逐步接入androidx绝对是一件好事。但是目前来说,很多第三方库还是用的support版本,因此给迁移带来了一定麻烦。完整的support与androidx映射关系请参考:官方文档

1.如果你已有项目,AndroidStudio3.2及以上版本提供了一键迁移功能,如下图:

2.迁移之前先保证你项目的gradle版本必须是3.2.0+,compileSdkVersion为28以上

classpath 'com.android.tools.build:gradle:3.5.2'

3.在gradle.properties文件里添加配置:

android.useAndroidX=true
android.enableJetifier=true
  • android.useAndroidX:如果设置为 true,Android 插件会使用相应的 AndroidX 库,而非support库。如果未指定,则该标记默认为 false
  • android.enableJetifier:如果设置为 true,Android 插件会重写其二进制文件,自动迁移现有的第三方库以使用 AndroidX。如果未指定,则该标记默认为 false

4.旧项目移除support.appcompat依赖,添加如下依赖:

implementation "androidx.appcompat:appcompat:1.0.2"

至此,迁移完毕

注意点:

1.在布局文件引用了support包的控件,包名需要手动修改为androidx的

2.引入第三方库看看是否支持androidx,支持的直接引入它的新版本

三、kotlin的迁移

参考我的另一篇博客: AndroidStudio配置kotlin

注意kotlin插件的版本也与gradle的版本有要求,注意对应关系。

//kotlin依赖
implementation "androidx.core:core-ktx:+"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.60"
//使用协程
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2"

四、项目配置

(1)明确需要用到的第三方库,本项目使用了如下第三方库,常见的一些热门框架如butterknife,Glide等这些根据个人需要添加,这里只是示例项目,值得注意的是这些热门框架大部分已经开始支持androidx,这是一件好事。

//OkHttp
implementation 'com.squareup.okhttp3:okhttp:4.2.2'
//今日头条屏幕适配方案
implementation 'me.jessyan:autosize:1.1.2'
//权限申请
implementation 'me.weyye.hipermission:library:1.0.7'

(2)填写项目所需的基本权限(在实际开发中按需增加)

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.INTERNET"/>

(3)各安卓版本的适配配置,参考:安卓版本适配之旅

(4)混淆规则配置,参考:安卓代码混淆(在实际开发中不断完善)

五、创建基类

在项目里,一般都会创建一些基类来封装一些通用的操作

六、封装工具类

在utils包下新建一些常用的工具类,封装一些通用的工具方法

七、MVP

MVP涉及到Model、View、Presenter

Model:用来存放一些网络、数据库、文件读写等操作,用于获取数据源

View:对应Activity、Fragment、Adapter等,只做UI操作,不做网络请求等耗时操作,

Presenter:执行Model提供的方法,获取数据,然后传递给View进行绑定显示

具体内容看项目源码

这样一个简易的项目框架基本就搭建完毕了,这个项目只是一个演示项目,没有太多业务逻辑,个人可以根据实际情况灵活变通。

后记:关于kotlin协程

1.协程作用域

GlobalScope:相当于全局作用域,不与具体Activity或Fragment生命周期关联,滥用会造成内存浪费

MainScope:理解为局部使用的作用域,可以跟Activity等生命周期关联起来

ViewModelScope:MVVM架构专属,项目使用了ViewModel的可以直接用这个

自定义作用域:

 private val viewModelJob = SupervisorJob()
 private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob) //UI作用域
uiScope.launch {//主线程(UI线程)
         val deferred = async(Dispatchers.IO){//异步线程(IO线程)
                delay(2000)
                "result"
         }
         showToast(defferred.await())//UI操作
     }
 }

2.取消协程

协程创建后注意在Activity生命周期结束时要调用cancel()取消。

viewModelJob.cancel()

以上是基于MVP模式的架构,接下来我还会一步一步教大家如何改造成MVVM模式并且引入Lifecycle、LiveData、ViewModel等架构组件,敬请期待

猜你喜欢

转载自blog.csdn.net/gs12software/article/details/103261053