首页 > 其他分享 >Android架构组件LiveData

Android架构组件LiveData

时间:2023-07-08 22:11:05浏览次数:41  
标签:生命周期 void 观察者 LiveData 组件 Android 数据 public

LiveData LiveData是基于观察者模式创建的,其中,LiveData是被观察者,观察者通过注册方法,监听被观察者的数据变化。LiveData在数据发生变化的时候,会通知观察者。 LiveData是一个容器,存放数据的容器,它的数据变化可以被监听,也就是LiveData是一个被观察者,如下,创建了一个存放String的数据容器currentName:

public class NameViewModel extends ViewModel {


// Create a LiveData with a String
private MutableLiveData<String> currentName;


   public MutableLiveData<String> getCurrentName() {
       if (currentName == null) {
           currentName = new MutableLiveData<String>();
       }
       return currentName;
   }


// Rest of the ViewModel...
}
监听LiveData数据变化,为LiveData添加观察者,如下,添加一个nameObserver,监听LiveData的数据变化,当LiveData的数据发生变化的的时候,onChanged方法会被回调,从而更新UI。
public class NameActivity extends AppCompatActivity {

   private NameViewModel model;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       // Other code to setup the activity...

       // Get the ViewModel.
       model = new ViewModelProvider(this).get(NameViewModel.class);
       // Create the observer which updates the UI.
       final Observer<String> nameObserver = new Observer<String>() {
           @Override
           public void onChanged(@Nullable final String newName) {
               // Update the UI, in this case, a TextView.
               nameTextView.setText(newName);
           }
       };
       // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
       model.getCurrentName().observe(this, nameObserver);
   }
}
更新LiveData数据的方式,使用setValue和postValue两个方法 LiveData发布修改有setValue和postValue两种方式,其中setValue只能在主线程调用,postValue则没有这个限制
button.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
       String anotherName = "John Doe";
       model.getCurrentName().setValue(anotherName);
   }
});
应用架构中的LiveData   LiveData 具有生命周期感知能力,遵循 activity 和 fragment 等实体的生命周期。您可以使用 LiveData 在这些生命周期所有者和生命周期不同的其他对象(例如 ViewModel 对象)之间传递数据。ViewModel 的主要责任是加载和管理与界面相关的数据,因此非常适合作为用于保留 LiveData 对象的备选方法。您可以在 ViewModel 中创建 LiveData 对象,然后使用这些对象向界面层公开状态。  activity 和 fragment 不应保留 LiveData 实例,因为它们的用途是显示数据,而不是保持状态。此外,如果 activity 和 fragment 无需保留数据,还可以简化单元测试的编写。   扩展LiveData 如果观察者的生命周期处于 STARTED 或 RESUMED 状态,LiveData 会认为该观察者处于活跃状态。以下示例代码说明了如何扩展 LiveData 类
public class StockLiveData extends LiveData<BigDecimal> {
    private StockManager stockManager;


    private SimplePriceListener listener = new SimplePriceListener() {
        @Override
        public void onPriceChanged(BigDecimal price) {
            setValue(price);
        }
    };


    public StockLiveData(String symbol) {
        stockManager = new StockManager(symbol);
    }


    @Override
    protected void onActive() {
        stockManager.requestPriceUpdates(listener);
    }


    @Override
    protected void onInactive() {
        stockManager.removeUpdates(listener);
    }
}
当LiveData对象具有活跃观察者时, 会调用 onActive() 方法。这意味着,您需要从此方法开始观察股价更新。 当 LiveData 对象没有任何活跃观察者时,会调用 onInactive() 方法。由于没有观察者在监听,因此没有理由与 StockManager 服务保持连接。 setValue(T) 方法将更新 LiveData 实例的值,并将更改告知活跃观察者。   LiveData使用总结
  1. 创建LiveData,使用viewModel类来包含
  2. 创建观察者Observer
  3. 调用LiveData的observe方法将LiveData以及Observer建立起发布-订阅关系
  4. 在适当的时机调用LiveData的setValue或者postValue发布新数据通知观察者
LiveData的优点
  •  

    能够确保数据和UI统一 LiveData采用了观察者模式,当数据发生变化时,主动通知被观察者。
  •  

    解决内存泄露问题 由于LiveData会在Activity/Fragment等具有生命周期的lifecycleOwner组件调用onDestory的时候自动解绑,所以解决了可能存在的内存泄漏问题。之前我们为了避免这个问题,一般有注册绑定的地方都要解绑(即注册跟解绑要成对出现),而LiveData利用生命周期感知功能解决了这一问题,可以实现只需关心注册,而解绑会根据生命周期自动进行的功能。
  •  

    当Activity停止时不会引起崩溃 当Activity组件处于inactive非活动状态时,它不会收到LiveData数据变化的通知。
  •  

    不需要手动处理生命周期的变化 观察者并不需要手动处理生命周期变化对自身的逻辑的影响,只需要关心如何处理获取到的数据。LiveData能够感知Activity/Fragment等组件的生命周期变化,所以就完全不需要在代码中告诉LiveData组件的生命周期状态,当数据发生变化时,只在生命周期处于active下通知观察者,而在inactive下,不会通知观察者。
  •  

    确保总能获取到最新的数据 什么意思呢?第一种情况,当观察者处于active活动状态。LiveData基于观察者模式,所以当数据发生变化,观察者能够马上获取到最新变化;第二种情况,当观察者处于inactive非活动状态。LiveData只能生命周期active下发送数据给观察者。举个例子,当Activity处于后台(inactive)时,LiveData接收到了新的数据,但这时候LiveData并不会通知该Activity,但是当该Activity重新返回前台(active)时会继续接收到最新的数据。一句话概括,LiveData是粘性的
  • configuration changes时,不需要额外的处理来保存数据我们知道,当你把数据存储在组件中时,当configuration change(比如语言、屏幕方向变化)时,组件会被recreate,然而系统并不能保证你的数据能够被恢复的。当我们采用LiveData保存数据时,因为数据和组件分离了。当组件被recreate,数据还是存在LiveData中,并不会被销毁。
  •  

    资源共享 通过继承LiveData类,然后将该类定义成单例模式,在该类封装监听一些系统属性变化,然后通知LiveData的观察者。
LiveData源码分析:
public interface Observer<T> {
  /**

   * Called when the data is changed.

   * @param t  The new data

   */
  void onChanged(@Nullable T t);
}


// 注意,他是 abstract class
public abstract class LiveData<T> {


  // 只有 onStart 后,对数据的修改才会触发 observer.onChanged()
  public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {}


  // 无论何时,只要数据发生改变,就会触发 observer.onChanged()
  public void observeForever(@NonNull Observer<T> observer) {}
}

 

   

标签:生命周期,void,观察者,LiveData,组件,Android,数据,public
From: https://www.cnblogs.com/ttylinux/p/17537976.html

相关文章

  • Unity UGUI的Toggle(复选框)组件的介绍及使用
    UnityUGUI的Toggle(复选框)组件的介绍及使用1.什么是Toggle组件?Toggle(复选框)是UnityUGUI中的一个常用组件,用于实现复选框的功能。它可以被选中或取消选中,并且可以代码通过其制控状态。2.Toggle组件的工作原理组Toggle件由两个部分组成:背景记标和。景背用于显示复选框的外观表......
  • Unity UGUI的Image(图片)组件的介绍及使用
    UGUI的Image(图片)组件的介绍及使用1.什么是UGUI的Image(图片)组件?UGUI的Image(图片)组件是Unity引擎中的一种UI组件,用于显示2D图像。它提供了一种简单而灵活的方式来在游戏中加载和显示图片。2.为什么要使用UGUI的Image(图片)组件?使用UGUI的Image组件可以方便地在游戏中展示各种图片......
  • Android开发腾讯云智面经分享
    分享一位读者面试腾讯云智(腾讯集团旗下的全资子公司)投稿的面经,主要记录了自己在面试过程中遇到的问题。下面是正文。本人在湖北的一所民办二本,学校非常一般。由于寒气逼人,快到七月才拿到offer,感谢腾讯云智!!!腾讯云智(武汉)一面(40min)1、GC原理,有哪几种GC方式。2、HashMap原理。3、H......
  • Vue组件化编程
    一、非单文件组件1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<title>非单文件组件</title>6<scriptsrc="js/vue.js"></script>7</hea......
  • Unity UGUI的Text(文本)组件的介绍及使用
    UGUI的Text(文本)组件的介绍及使用什么是UGUI的Text(文本)组件?UGUI(UnityGraphicUserInterface)是Unity引擎的一套用户界面系统,而Text(文本)组件是UGUI中用于在游戏界面中显示文本的组件。该组件可以用于显示游戏中的文字、数字、标签等信息。为什么要使用UGUI的Text(文本)组件?使用UG......
  • 实现组件赋值后重新渲染
    通过vuekey实现,原理官方文档。所以当key值变更时,会自动的重新渲染。<template><third-comp:key="menuKey"/></template><script>exportdefault{data(){return{menuKey:1}},watch:{menuTree(){++this.menuKey}}}</sc......
  • Android 14 功能和变更列表
    Android14功能和变更列表https://developer.android.google.cn/about/versions/14/summary?hl=zh-cnAndroid13功能和变更列表https://developer.android.google.cn/about/versions/13/summary?hl=zh-cn Android14功能和变更列表下表列出了所有记录的可能会影响应用开......
  • vue - v-model在组件上的应用(包含子传父)
    一、v-model的参数默认情况下,v-model在组件上都是使用modelValue作为prop,并以update:modelValue作为对应的事件。我们可以通过给v-model指定一个参数来更改这些名字:<MyComponentv-model:title="bookTitle"/>在这个例子中,子组件应声明一个titleprop,并通过触发upd......
  • Android实时获取摄像头画面传输至PC端
    前言最近在做一个PC端小应用,需要获取摄像头画面,但是电脑摄像头像素太低,而且位置调整不方便,又不想为此单独买个摄像头。于是想起了之前淘汰掉的手机,成像质量还是杠杠的,能不能把手机摄像头连接到电脑上使用呢?经过搜索,在网上找到了几款这类应用,但是都是闭源的。我一向偏好使用开源软......
  • 解决proAndroid的具体操作步骤
    proAndroidAndroid是一个开放的移动操作系统,由Google开发。它是目前全球市场份额最大的移动操作系统之一。Android操作系统的特点是开放性、可定制性和多样性。它提供了丰富的开发工具和平台,使开发者能够创建各种类型的应用程序,满足用户的不同需求。开发环境为了开始Android开发......