Jetpack初识

简介: Google为了开发者更好的设计软件的代码架构以及写出高质量的代码,推出Jetpack组件,将许多好用的代码进行封装,总之使用Jetpack可以使得我们利用更少的时间开发出更高质量的软件

一、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后面的依赖的写法
目录
相关文章
|
机器学习/深度学习 人工智能 算法
目标检测的国内外研究现状
作为计算机领域的一个重要的研究成果,深度卷积神经网络已经广泛用于图像分类问题。随着图像分类的准确度提高,基于卷积神经网络的图像目标检测算法已逐渐成为当前的研究热点。
6464 0
|
云安全 运维 架构师
阿里云ACE认证含金量高不高?考试内容难不难?
IT行业可以说是现在最热门的行业之一,很多人都想在这一行有所建树,于是他们就会选择考取阿里云人才认证来帮助自己提升技能、升职加薪。
1645 1
阿里云ACE认证含金量高不高?考试内容难不难?
|
小程序
【微信小程序】滚动 轮播图 文本
🍒小程序的宿主环境 - 组件 1.scroll-view 组件的基本使用 2.swiper 和 swiper-item 组件的基本使用 3.text 组件的基本使用 4.rich-text 组件的基本使用
【微信小程序】滚动 轮播图 文本
|
数据库 容器
Zabbix5.0安装部署,史上最详细,快收藏起来吧~~
Zabbix5.0安装部署,史上最详细,快收藏起来吧~~
1272 1
Zabbix5.0安装部署,史上最详细,快收藏起来吧~~
|
数据采集 机器学习/深度学习 算法
70个Python练手项目列表,实践中检验真理
70个Python练手项目列表,实践中检验真理
553 0
70个Python练手项目列表,实践中检验真理
Material Design 实战 之第三弹—— 悬浮按钮和可交互提示(FloatingActionButton & Snackbar & CoordinatorLayout)
Material Design 实战 之第三弹—— 悬浮按钮和可交互提示(FloatingActionButton & Snackbar & CoordinatorLayout)
|
存储 Cloud Native 多模数据库
|
存储 缓存 边缘计算
阿里云李忠仁:CDN业务升级与创新
2021年6月9日,亚太内容分发大会暨CDN峰会在北京举行,阿里云智能边缘云高级技术专家李忠仁受邀参加边缘加速论坛,分享了阿里云基于边缘云节点打造新一代CDN产品能力、技术架构及创新实践,助力企业提升效率、优化经营,推动更多新兴行业场景的创新发展。
1152 0
阿里云李忠仁:CDN业务升级与创新
|
存储 SQL 算法
炸锅了,MySQL表500W行,居然有人不做分区?
炸锅了,MySQL表500W行,居然有人不做分区?
1472 0
炸锅了,MySQL表500W行,居然有人不做分区?