Android架构组件之LiveData

本文详细介绍了Android架构组件中的LiveData,包括其基本概念、优点、使用方法、与Room的结合使用,以及如何扩展和变换LiveData数据。LiveData是一个生命周期感知的数据持有类,确保在组件激活时更新UI,避免内存泄露。它提供了map()和switchMap()方法用于数据转换,并可通过MediatorLiveData合并多个数据源。
摘要由CSDN通过智能技术生成

基本概念

LiveData是一个可以被观察的数据持有类,它可以感知并遵循Activity、Fragment或Service等组件的生命周期。正是由于LiveData对组件生命周期可感知特点,因此可以做到仅在组件处于生命周期的激活状态时才更新UI数据。

LiveData需要一个观察者对象,一般是Observer类的具体实现。当观察者的生命周期处于STARTEDRESUMED状态时,LiveData会通知观察者数据变化;在观察者处于其他状态时,即使LiveData的数据变化了,也不会通知。

LiveData可以使用如下方法注册观察者:

@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
   }

第一个参数为LifecycleOwner,在新的兼容库中,Activity、Fragment等都实现了LifecycleOwner接口。LifecycleOwner可以获取Lifecycle,从而得到组件的各生命周期状态。下面是LifecycleOwner的源码定义:

/**
 * A class that has an Android lifecycle. These events can be used by custom components to
 * handle lifecycle changes without implementing any code inside the Activity or the Fragment.
 *
 * @see Lifecycle
 */
@SuppressWarnings({
   "WeakerAccess", "unused"})
public interface LifecycleOwner {
   
    /**
     * Returns the Lifecycle of the provider.
     *
     * @return The lifecycle of the provider.
     */
    @NonNull
    Lifecycle getLifecycle();
}

第二个参数为观察者对象,当数据源变化时就会回调。Observer的源码如下:

/**
 * A simple callback that can receive from {@link LiveData}.
 *
 * @param <T> The type of the parameter
 *
 * @see LiveData LiveData - for a usage description.
 */
public interface Observer<T> {
   
    /**
     * Called when the data is changed.
     * @param t  The new data
     */
    void onChanged(@Nullable T t);
}

通过LiveData的observe方法进行关系绑定,就可以在组件的生命周期状态变为DESTROYED时移除观察者,这样Activity或Fragment就可以安全地观察LiveData而不用担心造成内存泄露。

LiveData的优点

  1. 确保数据源跟UI展示一致——当数据源变化时,LiveData会通知观察者更新UI,前提是组件在激活状态下。
  2. 不会造成内存泄露——由于ObserverLifecycleOwner建立关系,从而可以获取生命周期状态,当组件生命周期状态为DESTROYED时,会移除观察者。
  3. 当组件处于非激活状态时,不会收到数据更新回调。
  4. 无需手动处理生命周期——UI组件只需要观察对应的数据,LiveData根据其生命周期自动处理。
  5. 总是最新的数据——当Activity从后台切到前台时,总会收到最新的数据。
  6. 适配设备配置变化——如屏幕旋转,组件销毁重建后,立即收到上次的数据。
  7. 资源共享——参考【扩展LiveData】一节。

LiveData使用方法

使用LiveData的基本步骤:

  1. 在ViewModel中创建LiveData,并持有某种类型的数据。
  2. 创建一个Observer对象并实现其onChanged()回调,一般在Activity或Fragment中创建Observer
  3. 在Activity或Fragment中通过LiveData的observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer)方法建立观察关系。

LiveData的observeForever(@NonNull Observer<T> observer)方法不需要传入LifecycleOwner,这意味着是永久观察,无关生命周期状态,任何时候有数据更新都会回调onChanged()

创建LiveData
public class NameViewModel extends ViewModel {
   

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

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

// Rest of the ViewModel...
}

一般LiveData都会在ViewModel中实现,MutableLiveData继承自LiveData,表示可变数据,提供了数据设置方法。

观察LiveData对象

通常在UI组件的onCreate()中建立对LiveData的观察关系。下面的代码片段演示了如何观察LiveData对象:

public class NameActivity extends AppCompatActivity {
   

    private NameViewModel mModel;

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

        // Other code to setup the activity...

        // Get the ViewModel.
        mModel = ViewModelProviders.of
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值