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

Jetpack LiveData使用(一)

[复制链接]
八步半的房间 发表于 2021-1-2 18:59:14 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
目次
LiveData有哪些优势?
LiveData 使用
LiveData有哪些优势?

LiveData 是一个可以被观察的数据持有类,它可以感知 Activity、Fragment或Service 等组件的生命周期。LiveData 是可被观察的数据持有类。具有生命周期(Activity/Fragment/Service)感知的(确保active状态下担当data更新
 简单来说,他主要有一下优点。
  

  • 它可以做到在组件处于激活状态的时候才会回调相应的方法,从而刷新相应的 UI。
  • 不消担心发生内存泄漏
  • 当 config 导致 activity 重新创建的时候,不需要手动取处置处罚数据的储存和规复,它已经帮我们封装好了。
  • 当 Actiivty 不是处于激活状态的时候,如果你想 livedata setValue 之后立刻回调 obsever 的 onChange 方法,而不是比及 Activity 处于激活状态的时候才回调 obsever 的 onChange 方法,你可以使用 observeForever 方法,但是你必须在 onDestroy 的时候 removeObserver。
追念一下,在你的项目中,是不是经常会遇到这样的问题,当网络请求效果返来的时候,你经常需要判断 Activity 大概 Fragment 是否已经 Destroy, 如果不是 destroy,才更新 UI。而当你如果使用 Livedata 的话,因为它是在 Activity 处于 onStart 大概 onResume 的状态时,他才会举行相应的回调,因而可以很好得处置处罚这个问题,不必谢一大堆的 activity.isDestroyed()。
接下来,让我们一起来看一下 LiveData 的使用。
LiveData 使用

LiveData是抽象类 ,MutableLiveData 是它的实例对象
  1. //声明一个liveDataval liveA = mutableLiveData()//在需要的时候赋值liveA.value = "some value of liveA"////在UI中,观察,在active状态下可以感知厘革val liveAObserver = Observer{    value?.let{        //do something    }}liveA.observe(vivewLifeCycleOwner,liveAObserver)
复制代码
步调一:先创建出MutableLiveData 一个实例对象,这个对象是有
步调二:注册刚刚创建的MutableLiveData,就可以观察到厘革的数据
下面演示一个完整例子:

  • 步调一:创建一个activity和一个fragment,使用MutableLiveData创建livedata实例:
  1.     //声明变量livedata    val liveAppleData = MutableLiveData()
复制代码

  • 步调二:注册一个liveData的观察,当liveData中值厘革后设置到UI界面上:
这个是activity的监听和设置值:
  1.         //变动livedata的值        btn_change_live.setOnClickListener {            liveAppleData.value = "当前liveData的值:${System.currentTimeMillis()}"        }        //观察值        liveAppleData.observe(this, Observer {            tv_live_data_activity.text = it            Log.d("LiveActivity", "LiveData在LiveActivity中 $it")        })
复制代码
这个是fragment的设置值,监听用的和activity是用一个对象:
  1.         (requireActivity() as LiveActivity).apply {            liveAppleData.observe(viewLifecycleOwner, Observer {                tv_live_apple.text = it                Log.i("AppleFragment", "LiveData在AppleFragment中 $it")            })        }
复制代码
整体效果如图:

点击改变LiveData按钮,此时activity和fragment中的livedata都监听到数据厘革,并直接在UI上更新了时间。别的还演示了,当隐藏掉fragment时,点击改变livedata数据后,再次点击显示fragment时自动获取到了和activity一致的时间值。
activity:
  1. class LiveActivity : AppCompatActivity() {    //声明变量live data    val liveAppleData = MutableLiveData()    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_livedata)        //Fragment        val appleFragment = AppleFragment()        supportFragmentManager.beginTransaction()            .add(R.id.fl_container_live, appleFragment)            .commit()         TODO 注意 hide 和 show不会改变fragment的生命周期状态 所以用attach detach        //显示fragment        btn_create_fg_live.setOnClickListener {            supportFragmentManager.beginTransaction()                .attach(appleFragment)                .commit()            Log.d("LiveActivity", "onCreate: 显示fg ${appleFragment.isVisible}")        }        //隐藏        btn_destroy_fg_live.setOnClickListener {            supportFragmentManager.beginTransaction()                .detach(appleFragment)                .commit()            Log.w("LiveActivity", "onCreate: 隐藏fg ${appleFragment.isVisible}")        }        //变动livedata的值        btn_change_live.setOnClickListener {            liveAppleData.value = "当前liveData的值:${System.currentTimeMillis()}"        }        //观察值        liveAppleData.observe(this, Observer {            tv_live_data_activity.text = it            Log.d("LiveActivity", "LiveData在LiveActivity中 $it")        })    }}
复制代码
fragment:
  1. class AppleFragment : Fragment() {    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        Log.d("AppleFragment", "onCreate")    }    override fun onCreateView(        inflater: LayoutInflater,        container: ViewGroup?,        savedInstanceState: Bundle?    ): View? {        return inflater.inflate(R.layout.fg_apple, container, false)    }    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {        super.onViewCreated(view, savedInstanceState)        (requireActivity() as LiveActivity).apply {            liveAppleData.observe(viewLifecycleOwner, Observer {                tv_live_apple.text = it                Log.i("AppleFragment", "LiveData在AppleFragment中 $it")            })        }    }}
复制代码
项目完整代码

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

使用道具 举报

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

本版积分规则


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

18768367769

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

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

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