请选择 进入手机版 | 继续访问电脑版

Android(Kotlin)Jetpack组件之LiveData使用与API

[复制链接]
为你演绎 发表于 2021-1-1 18:29:02 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题




你若需要时间,还得自己把他造出来。 喝汤能补 (* ^ ▽ ^ *)
前言

  该文章作为学习交换,如有错误欢迎各位大佬指正 (* ^ ▽ ^ *)

概述

  LiveData 是JetPack提供的一种响应式编程组件,可以包罗任何范例的数据,并在数据发送厘革时通知观察者。


  • LiveData一般与ViewModel一起使用,也可单独用在其他地方。即,在Activity中,我们可以不用手动获取ViewModel中的数据来更新界面,而是当ViewModel中数据改变时,主动通知Activity。
  • LiveData内部使用了Lifecycles组件来自我感知生命周期的厘革,从而在Activity销毁时实时释放引用,避免产生内存泄漏
  • 如果界面不可见状态(息屏,大概被其他Activity遮挡),LiveData数据发送了厘革,也不会通知观察者,这也是依靠于Lifecycles组件。
  • LiveData数据发送多次厘革,当Activity规复可见状态时,只有最新的那份数据才会通知给观察者,之前的数据都被丢弃了。
使用

依赖库

依赖库添与ViewModel的添加方式一样
基本使用


  • 创建使用LiveData包罗的数据
      MutableLiveData 是一种可变的LiveData,LiveData是一种不可变的LiveData。它们使用的主要方法是:
  1. getValue()  获取LiveData中包罗的数据,如果数据为空,则会返回null值setValue()   给LiveData设置数据postValue()   在非主线程中,给LiveData设置数据
复制代码
  在实际使用中,因kotlin语法糖,可以直接通过.value的方式举行获取和赋值。

  • 通过 LiveData对象的observe()绑定观察者
      任何LiveData对象都可以调用它的observe()方法来观察数据的厘革。
  1. observe(LifecycleOwner owner, Observer            
复制代码
扩展:map与switchMap

  当我们的项目变的越来越复杂时候,基本的时候一定是无法满意我们的业务场景的,大概需要举行某些转换操纵,而LiveData也提供了通用的map与switchMap两种转换。
扩展:map

  Map函数的使用场景:需要将某个LiveData对象转成任意其他范例的LiveData。


  • Transformations.map(LiveData source , Function mapFunction)函数
    用于将某个范例的LiveData转成任意其他范例的LiveData。
    第一个参数:原始的LiveData对象
    第二参数:一个转换函数,用于编写转换的逻辑
  • 当数据发生厘革的时候,map()函数会监听到厘革并执行转换函数中的逻辑,然后再将转换后的数据通知给观察者。
大抵的代码语法
  1. Transformations.map(原始LiveData对象){          转化后的Livedata对象    }
复制代码
简朴示例:将Book的LiveData对象转为name的LiveData对象。
  1. class Book {    var name:String = "自由"    var count:Int = 2}    private val nameLiveData = MutableLiveData()    val name: LiveData = Transformations.map(nameLiveData){ user->        user.name    }
复制代码
扩展:switchMap

  switchMap函数的使用场景比力固定:某个LiveData对象是调用别的的方法获取的时候。


  • Transformations.switchMap(LiveData source , Function mapFunction)函数
    用于如果某个LiveData对象是调用别的的方法获取的,那么可以将这个LiveData对象转换成别的一个可观察的LiveData对象。
    第一个参数:原始的LiveData对象
    第二参数:一个转换函数,用于编写转换的逻辑,在这个转换函数中必须返回一个LiveData对象
  • 当数据发生厘革的时候,switchMap()函数会监听到厘革并执行转换函数中的逻辑,然后再将可观察的LiveData对象返回。
  因为在别的的方法中,大概是直接新建的一个对象,如果我们直接在Activity中通过方法获取的LiveData对象的observe函数去监听,这样得到的对象永远都是老的LiveData实例,每次新的LiveData无法观察。
错误代码示范
  1. object Repository {    fun getBook(name: String): LiveData{        val liveData = MutableLiveData()        liveData.value = Book(name)        return liveData    }}class MapViewModel : ViewModel() {    fun getBookName(name: String): LiveData            book.name        }
复制代码
正确的方式
代码的效果,点击按钮,生成随机数字,并显示在界面上
  1. class MainActivity : AppCompatActivity() {    lateinit var viewModelBook: MapViewModel    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_main_live_data)                btn_book.setOnClickListener {            val nunm = (0..100).random().toString()            viewModelBook.getBookName(nunm)        }        // 绑定观察者,当数据厘革时,自动更新界面        viewModelBook.name2.observe(this, Observer { book ->            tv_name.text = book.name        })
复制代码
  1. class MapViewModel : ViewModel() {    private val mNameLiveData2 = MutableLiveData()    val name2: LiveData = Transformations.switchMap(mNameLiveData2){ book ->        Repository.getBook(book)    }    fun getBookName(name: String) {        mNameLiveData2.value = name    }}
复制代码
  1. object Repository {    fun getBook(name: String): LiveData{        val liveData = MutableLiveData()        liveData.value = Book(name)        return liveData    }}class Book(name: String) {    var name:String = name    var count:Int = 2}
复制代码
以为有资助的点下赞哟,究竟三连步骤更多,嘻嘻,谢谢各人的支持(* ^ ▽ ^ *)

来源:https://blog.csdn.net/qq_36462112/article/details/111997538
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )