JetPack使用记录之添加依赖

334 阅读3分钟

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"