zoukankan      html  css  js  c++  java
  • Android 架构组件-Lifecycle、LiveData、ViewModel

    Lifecycle

    Lifecycle组件包括LifecycleOwner、LifecleObserver,能方便监听Activity或者Fragment的生命周期。

    步骤:

    1.实现LifecycleObserver接口

    • 实现DefaultLifecycleObserver接口,然后重写里面生命周期方法;
    • 直接实现LifecycleObserver接口,然后通过注解的方式来接收生命周期的变化;

    对于这两种形式,Lifecycle.java文档中是建议使用第一种方式,因为文档中说明了,随着Java8成为主流,注解的方式会被弃用。

    2.添加观察者。

       通过getLifecycle().addObserver(mPresenter)方法

     Activity基类实现了LifecycleOwner方法,因此可以直接获取该方法。

    3.监听生命周期。

    注意:activity/Fragment的生命周期发生改变时,onStart、onResume方法会先被调用后,再调用Observer中重写方法,onPause/onDestory反之。

    ViewModel

    ViewModel是一个用来为Activity或Fragment管理数据的类,ViewModel一般用来处理Activity/Fragment和应用其他部分数据的通信。

    ViewModel创建与一个作用域(Activity/Fargment)有关,只要组件不被Destory,那么Viewmodel会一直存活。viewmodel创建后会存储这个这个作用域,在activity重新恢复时,会返回已存在的viewmodel。

    例如,如果作用域是一个Activity,那么Viewmodel会一直保留直到Activity生命周期结束。但是在activity横竖屏切换中,activity执行了onDestory方法,并不代表该Activity被销毁,我们可以通过isFinishing方法得知。旋转屏幕时,isFinishing为false,按下返回键时,isFinishing为true。

    viewmodel的作用是管理UI的数据,不能访问UI或者持有activity/Fragment的引用。

    LiveData

    LiveData是一个数据持有类,具有如下特点:

    1.数据可以被观察者订阅。

    2.能感知组件(Fragment、Activity、Service)的生命周期。

    2.只有在组件处于激活状态(STATED、RESUME)才会通知数据刷新。(除了onDestory方法为DESTORY状态,其他回调方法皆为STARTD/RESUME等)

    LiveData的优点:

    • 能够保证数据和UI统一

     这个和LiveData采用了观察者模式有关,LiveData是被观察者,当数据有变化时会通知观察者(UI)。

    • 减少内存泄漏

     这是因为LiveData能够感知到组件的生命周期,当组件处于DESTROYED状态时,观察者对象会被清除掉。

    • 当Activity停止时不会引起崩溃

     这是因为组件处于非激活状态时,不会收到LiveData中数据变化的通知。

    • 不需要额外的手动处理来响应生命周期的变化

     这一点同样是因为LiveData能够感知组件的生命周期,所以就完全不需要在代码中告诉LiveData组件的生命周期状态。

    • 组件和数据相关的内容能实时更新

     组件在前台的时候能够实时收到数据改变的通知,这是可以理解的。当组件从后台到前台来时,LiveData能够将最新的数据通知组件,这两点就保证了组件中和数据相关的内容能够实时更新。

    • 针对configuration change时,不需要额外的处理来保存数据

      我们知道,当你把数据存储在组件中时,当configuration change(比如语言、屏幕方向变化)时,组件会被recreate,然而系统并不能保证你的数据能够被恢复的。当我们采用LiveData保存数据时,因为数据和组件分离了。当组件被recreate,数据还是存在LiveData中,并不会被销毁。

    • 资源共享

     通过继承LiveData类,然后将该类定义成单例模式,在该类封装监听一些系统属性变化,然后通知LiveData的观察者。

    LiveData使用:

    LiveData内部是通过Lifecycle实现监听回调的,具体可以看源码。

    步骤:

    1.创建保存特定数据类型的LiveData实例;

    2.创建Observer对象,作为参数传入LiveData添加观察者;

    3.更新LiveData对象存储数据。

    1.添加依赖

    //viewModel
        api 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0-alpha02'
    //LifecycleObserver 与 LiveData
        api 'androidx.lifecycle:lifecycle-extensions:2.2.0-alpha02'

    2.创建LiveData实例

     Android文档中建议将LiveData与ViewModel配合起来使用,当然它也可以单独使用,不过需要注意数据和组件之间的分离,LiveData一定不能持有组件的对象,否则在组件被销毁时,LiveData仍持有Activity/Fragment 对象,导致的结果是组件无法被回收。

         MutableLiveData为LiveData的子类。

     3.创建Observer对象,添加观察者。

    在组件中创建通过LiveData.Observe()方法添加观察者,当数据变化时会通过该回调方法通知观察者,弹出吐司。

    添加观察者的方式为2种:

    • observe()方法:当组件生命周期发生变化时,onStateChanged()方法会被调用。组件为DESTORY状态时,会自动取消订阅。
    • observeForever()方法:onStateChanged()方法会被调用三次(CREATED、STARTED、RESUMED),后面就不会收到DESTROYED的状态,需要手动取消订阅。

    4.更新LiveData中的数据。

    更新LiveData有2种方式,:

    • setValue() :主线程中调用,如果非主线程,会抛出异常。
    • postValue() :既可以在主线程也可以在子线程中调用,最终会调用setValue方法改变存储的数据。

     参考链接:

    1.https://blog.csdn.net/zhuzp_blog/article/details/78871374

    2.https://blog.csdn.net/zhuzp_blog/article/details/78871527

    3.viewmodel和LiveData的使用:

    https://www.jianshu.com/p/721cdcdf11b2

  • 相关阅读:
    观念真的非常重要
    POJ 2031 prim
    在asp.net mvc中使用PartialView返回部分HTML段
    JavaScript实现获取table中某一列的值
    poj2533--Longest Ordered Subsequence(dp:最长上升子序列)
    74HC595的中文资料
    cocos 事件分发2
    从二叉搜索树到平衡二叉搜索树
    Opencv中integral计算积分图
    函数多个“返回值”
  • 原文地址:https://www.cnblogs.com/fangg/p/11284575.html
Copyright © 2011-2022 走看看