z之前一直看过JetPack的项目,比如官方的sunflower和wanAndroid中一些项目,但是很多都比较简单,无法使用到具体项目中,所以这次借皖仪云APP的机会,来使用一下,记录一些问题。
添加依赖
有时我们使用Jetpack会发现一下子加了很多依赖库,其实Google官方还是区分的很清楚的,这里也有必要分清一下,不必要的库就不加,以免APP的体积过大。
Android KTX库,是一组kotlin扩展程序,这些扩展程序可以为Jetpack、Android平台和其他API提供简洁惯用的Kotlin代码,说白了就是一组方便编码的扩展包。这个KTX很多东西,分为了很多模块,每个模块包含一个或者多个软件包,下面看一下常用的:
-
Core KTX,核心模块是直接为属于Android框架的通用库提供扩展程序,这些扩展程序不依赖于Fragment啥的,是通用的框架代码,比如view、content等等。
implementation 'androidx.core:core-ktx:1.3.2'
-
Fragment KTX,Fragment的扩展程序,提供了一系列程序来简化Fragment API,这个扩展程序非常有用:
api "androidx.fragment:fragment-ktx:1.2.5"
比如简化语法之简化Fragment事物:
fragmentManager()
.commit {
addToBackStack("...")
setCustomAnimations(R.anim.enter_anim,R.anim.exit_anim)
add(fragment, "...")
}
再者就是很重要的viewModels和activityViewModels,可以使用这2个函数来获取fragment或者activity的引用在创建ViewModel时,有什么用呢,就是生命周期,比如我这个viewModel只在fragment中使用,那它的生命周期就是fragment相关,而不是fragment的容器activity:
// Get a reference to the ViewModel scoped to this Fragment
val viewModel by viewModels<MyViewModel>()
// Get a reference to the ViewModel scoped to its Activity
val viewModel by activityViewModels<MyViewModel>()
- Lifecycle KTX,关于什么是Lifecycle这章节不做细说,这里的KTX为每个Lifecycle对象定义了一个LifecycleScope,也就是范围,作用就是在范围内启动的协程会在Lifecycle被销毁时取消。想获取这个CoroutineScope也非常简单,使用lifecycle.coroutineScope和lifecycleOwner.lifecycleScope方法。
因为协程必须在协程范围里使用,所以这个十分重要,当需要在Lifecycle中启动协程,而且协程能在Lifecycle对象销毁时自动取消,那这个库必须添加:
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0-alpha02"
下面代码示例演示一下使用fragment的协程Scope来启动一个协程:
class MyFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
val params = TextViewCompat.getTextMetricsParams(textView)
val precomputedText = withContext(Dispatchers.Default) {
PrecomputedTextCompat.create(longTextContent, params)
}
TextViewCompat.setPrecomputedText(textView, precomputedText)
}
}
}
-
LiveData KTX,这个库有一个特别重要的函数,就是liveData构建器函数,顾名思义就是构建出一个LiveData,最重要的是会调用suspend函数,也就是挂起函数(协程),并且将结果座位LiveData对象传送给LiveData自己。
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.0-alpha02"
看个例子,我们平时的LiveData都是用来包装一种数据来让其变成可观察,那这个如何赋值呢,要不是retrofit返回直接就是LiveData,要不就是调用value方法进行赋值,还有就是通过构建器:
val user: LiveData<User> = liveData {
val data = database.loadUser() // loadUser is a suspend function.
emit(data)
}
比如这里协程返回的data应该就是User类型,把它通过emit赋值到LiveData对象中。
-
ViewModel KTX,这个扩展程序非常有用,它为ViewModel提供了一个viewModelScope()函数,也就是协程范围,使用这个协程范围可以启动协程,同时在清除ViewModel时会取消。
api "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"