一、Jetpack产生背景
Google为了开发者更好的设计软件的代码架构以及写出高质量的代码,推出Jetpack组件,将许多好用的代码进行封装
总之使用Jetpack可以使得我们利用更少的时间开发出更高质量的软件
二、ViewModel
ViewModel的生命周期比Activity长,随Activity的销毁而销毁,可以保证手机屏幕旋转时ViewModel的数据不会丢失
可以将与界面相关的数据放入ViewModel以减轻Activity的负担
由于ViewModel的生命周期比Activity长,故不能直接创建ViewModel,需要通过ViewModelProvider来获取实例
ViewModelProvider(<activity或者fragment的实例>).get(<viewModel的实例>::class.java)
向ViewModel中传递参数
利用ViewModelProvider的Factory的接口来实现传递数据
三、Lifecycles
利用LifecycleObserver进行观察Activity的生命周期,举个例子
class MyObserver(val lifecycle: Lifecycle):LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun activityStart(){
Log.d("MyObserver","activityStart")
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun activityStop(){
Log.d("MyObserver","activityStop")
}
}
//这里采用注解的方式传入了生命周期事件
//这里的方法就会在各种生命周期事件触发时进行调用
生命周期发生变化时需要采取以下调用方式才可以得到通知
lifecycleOwner.lifecycle.addObserver(MyObserver(lifecycle))
//lifecycleOwner一般是指Activity或者fragment
也可以获取当前的生命周期状态
lifecycle.currentState
四、LiveData
LiveData可以将数据变化传给观察者,可以是任何类型的数据,当ViewModel数据发生变化时,LiveData可以观察到数据的变化
子线程给LiveData设置数据,一定要调用postValue(),不能使用setValue,否则会发生崩溃
这里也稍微提一下map与switchMap的区别以及使用场景
//Map
//当我们不想要全部的LiveData暴露给外部,我们可以使用Map,举个小栗子
//不过Map的LiveData数据是在ViewModel里面创建的,外部创建的话就使用switchMap
val userName:LiveData<String> = Transformations.map(userLiveData){user ->
"${user.firstName} ${user.lastName}"
}
//这里将数据转化成两个字符串的拼接
//switchMap
//当LiveData实例是外部创建的时候,需要使用switchMap
//让其转化成可以观察的LiveData
五、Room
Room是Google提供的一个便捷开发者操作数据库的一个组件,利用Room组件可以便捷的操作数据库而不需要编写大量的SQL代码
主要由Entity,Dao,Database三个部分组成
1.Entity
即数据类,加上@Entity注解使得我们可以使用面向对象的方法来进行数据库操作
相当于数据库中的一张表
2.Dao
Data Access Object
通常在这里进行数据库的操作,直接在这里编写数据库的逻辑代码
3.Database
//这里将Entity和Dao连接在一起
//需要定义三部分的内容
1.数据库版本号
2.包含的实体类
3.Dao层的访问实例
//需要使用全局context,即ApplicationContext
这里当时出现了虚拟机的LogService坏掉的情况,开台新的就可以了,调试了好久
Room进行数据库升级比较的复杂,而且每次升级都需要编写大量的逻辑,虽然Google这里提供了粗暴简单的方法
fallbackToDestructiveMigration()
//只要数据库升级,直接销毁重建
//适用于前期测试使用
升级主要利用Migration,具体操作可以用到了再看
六、WorkManager
WorkerManager的基本用法
1.定义一个任务,并且编写他的后台逻辑
2.设置任务的启动条件,和一些约束条件并且构建后台任务的请求
3.将任务传入WorkManager的enqueue方法
举个栗子
class SimpleWorker(context: Context,params:WorkerParameters):Worker(context,params) {
override fun doWork(): Result {
Log.d("SimpleWorker","do work in SimpleWorker")
return Result.success()
}
}
//这里定义了一个工作类,只需要在Worker类里面重写唯一的一个方法即可
val request = OneTimeWorkRequest.Builder(SimpleWorker::class.java)
.setInitialDelay(30,TimeUnit.SECONDS)
.addTag("simple")
.build()
WorkManager.getInstance(this).enqueue(request)
//这里就是构建后台任务的请求,几个方法都比较简单
//具体可以用到了边查边用
也可以开启链式任务,使用beginWith()方法开启任务,then()接入下一个任务
七、Kotlin:DSL构建专用语法结构
主要采用高阶函数和lambda表达式的方法构建,尤其是高阶函数使得代码更加简洁,
举个简单的小栗子
class Dependency{
val libraries = ArrayList<String>()
fun implementation(lib:String){
libraries.add(lib)
}
}
//定义好这样一个类之后,就可以采用和gradle类似的语法编写依赖
fun dependencies(block:Dependency.() -> Unit):List<String>{
val dependency = Dependency()
dependency.block()
return dependency.libraries
}
//这个函数进行包装
val libraries = dependencies{
implementation("com1")
implementation("com2")
}
//这样的代码是不是非常像gradle后面的依赖的写法