Android架构组件LiveData

这篇具有很好参考价值的文章主要介绍了Android架构组件LiveData。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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) {}
}

 文章来源地址https://www.toymoban.com/news/detail-534608.html

 
 

到了这里,关于Android架构组件LiveData的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Architecture Components ——LiveData使用

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_live_data); } @Override public void onAttachedToWindow() { super.onAttachedToWindow(); viewModel = ViewModelProviders.of(this).get(LiveDataViewModel.class); MutableLiveData liveData = viewModel.getLiveData(); liveData.observe(th

    2024年04月27日
    浏览(32)
  • Android JetPack深入分析LiveData源码

    Google Android开发者 LiveData概览 在了解 LiveData 源码之前,建议先了解 LifeCycle 相关知识,请参考:Android JetPack深入分析Lifecycle源码 定义 从定义中,我们可以大概知道: LiveData 是一个数据存储类,能够感知 Activity 、 Fragment 等组件的生命周期,并且支持对它存储的数据进行观察

    2024年02月12日
    浏览(30)
  • Android Architecture Components ——LiveData使用,android热修复视频

    小结:getApplication()即是全局的上下文 Activity中进行数据监听 import android.arch.lifecycle.MutableLiveData; import android.arch.lifecycle.Observer; import android.arch.lifecycle.ViewModelProviders; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log;

    2024年04月17日
    浏览(33)
  • 【Android】LiveData在广播中的使用

    将Livedata在广播中进行使用,这样当广播消息,使用Livedata进行观察获取消息,不需要在Activity里面注册广播了,特别适合在多个Activity里面都要监听一个广播的需求。 现在有一个手表连接的广播,当手表连接状态改变时,有多个Activity需要获取到这个手表改变的状态,然后根

    2024年02月12日
    浏览(24)
  • Android JetPack~LiveData(二) 数据倒灌问题

    Android数据绑定技术一,企业级开发 Android数据绑定技术二,企业级开发 Android  JetPack~ DataBinding(数据绑定)(一)    集成与使用 Android  JetPack~ LiveData (一)   介绍与使用 Android JetPack~LiveData(二) 数据倒灌问题 Android  JetPack~ ViewModel (一)   介绍与使用 如果我们在一个home页面获取网络

    2024年02月02日
    浏览(30)
  • Android 架构 - 组件化 Componentization

    组件化是基于可重用目的,对单个功能进行开发,提升复用性降低耦合度。多个功能组件起来就是一个业务组件,多个业务组件组合起来就是一个应用,因此去除了模块间的耦合,使得按业务划分的模块成了可单独运行的业务组件。(组件化只是一定程度上的独立,还是依附

    2024年01月16日
    浏览(41)
  • Android入门教程||Android 架构||Android 应用程序组件

    Android 操作系统是一个软件组件的栈,在架构图中它大致可以分为五个部分和四个主要层。 在所有层的最底下是 Linux - 包括大约115个补丁的 Linux 3.6。它提供了基本的系统功能,比如进程管理,内存管理,设备管理(如摄像头,键盘,显示器)。同时,内核处理所有 Linux 所擅

    2024年02月13日
    浏览(33)
  • Android-Jetpack>;>; LiveData粘性数据

    米哈游校招技术提前批来啦 靠谱内推,全程跟进! 有需要的小伙伴可以帮忙辅导简历哈! 投递后可私信我跟进~ 内推码:NE449    入职 南大通用 个人感受 Hello啊各位朋友们,这里先说一下个人情况吧,我是河北工业大学23届的本科生,计算机本专业的。然后我是春招进的南

    2024年02月17日
    浏览(30)
  • Android Jetpack组件架构:ViewModel的原理

    本篇文章是关于介绍ViewModel的,由于ViewModel的使用还是挺简单的,这里就不再介绍其的基本应用,我们主要来分析ViewModel的原理。 众所周知,一般使用ViewModel是用来解决两个问题的,第一个就是关于设备配置发生改变时Activity先前状态的保存,在ViewModel出来之前我们一般会使

    2024年02月07日
    浏览(32)
  • Android Jetpack 从使用到源码深耕【LiveData 从实践到原理 】(三)

    之前几篇文章,我们通过一个简单的实例需求,将LiveData引入了进来,从而知道了使用它的好处。然后我们通过对其原理的猜想,实现方案的步步探索,自己通过编码实现了LiveData框架。 Android Jetpack 从使用到源码深耕【LiveData 从实践到原理 】(一) Android Jetpack 从使用到源码

    2024年02月04日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包