Android 架构组件——LiveData 探究与使用

LiveData是一个可被观察的数据持有者类。与常规的Observable不同,LiveData能意识到应用程序组件的生命周期变化,这意味着它能遵守Activity、Fragment、Service等组件的生命周期。这种意识确保LiveData只更新处于活跃状态的应用程序组件Observer。

一、 LiveData  是什么?

LiveData实现基本的Android Activity/Fragment生命周期感知,本身其持有可观察数据,开发者可用LiveData的onActive/onInactive实现与Android生命周期解耦/耦合,进而通过LiveData的postValue或者setValue方法,通知观察者Observer数据的变化并请可观察的变化数据通过Observer的onChanged传导出来。

二、LiveData 优势是什么?

  如果一个Observer的生命周期处于STARTED或RESUMED状态,那么LiveData将认为这个Observer处于活跃状态。 LiveData仅通知活跃的Observer去更新UI。 非活跃状态的Observer,即使订阅了LiveData,也不会收到更新的通知。

  结合一个实现了LifecycleOwner接口的对象,你能注册一个Observer。这种结合关系使得当具有生命周期的对象的状态变为DESTROYED时,Observer将被取消订阅。 这对于Activity和Fragment尤其有用,因为它们可以安全地订阅LiveData对象,而不必担心内存泄漏 - 当Activity和Fragment生命周期为DESTROYED时,它们立即会被取消订阅。

  1. 确保UI符合数据状态
    LiveData遵循观察者模式。 当生命周期状态改变时,LiveData会向Observer发出通知。 您可以把更新UI的代码合并在这些Observer对象中。不必去考虑导致数据变化的各个时机,每次数据有变化,Observer都会去更新UI。
  2. 没有内存泄漏
    Observer会绑定具有生命周期的对象,并在这个绑定的对象被销毁后自行清理。
  3. 不会因停止Activity而发生崩溃
    如果Observer的生命周期处于非活跃状态,例如在后退堆栈中的Activity,就不会收到任何LiveData事件的通知。
  4. 不需要手动处理生命周期
    UI组件只需要去观察相关数据,不需要手动去停止或恢复观察。LiveData会进行自动管理这些事情,因为在观察时,它会感知到相应组件的生命周期变化。
  5. 始终保持最新的数据
    如果一个对象的生命周期变到非活跃状态,它将在再次变为活跃状态时接收最新的数据。 例如,后台Activity在返回到前台后立即收到最新数据。
  6. 正确应对配置更改
    如果一个Activity或Fragment由于配置更改(如设备旋转)而重新创建,它会立即收到最新的可用数据。
  7. 共享资源
    您可以使用单例模式扩展LiveData对象并包装成系统服务,以便在应用程序中进行共享。LiveData对象一旦连接到系统服务,任何需要该资源的Observer都只需观察这个LiveData对象。

三、如何在Android项目中使用 LiveData?

 官方文档快速入口:https://developer.android.google.cn/topic/libraries/architecture/adding-components

1.在gradle添加引用:

    compile "android.arch.lifecycle:runtime:1.0.0"
    compile "android.arch.lifecycle:extensions:1.0.0"
    annotationProcessor "android.arch.lifecycle:compiler:1.0.0"

2.使用LiveData,首先建立LiveData数据,一般继承自MutableLiveData。
MutableLiveData是LiveData的子类,添加了公共方法setValue和postValue,方便开发者直接使用。setValue必须在主线程调用。postValue可以在后台线程中调用。 


public class MyViewModel extends ViewModel {
    private MutableLiveData> users;
    public LiveData> getUsers() {
        if (users == null) {
            users = new MutableLiveData>();
            loadUsers();
        }
        return users;
    }

    private void loadUsers() {
        // do async operation to fetch users
    }

3.构建Observer,在Observer的onChanged中等待变化数据传导过来。
在LiveData中的数据变化,通过postValue(可后台线程)或者setValue(主线程)设置后,将触发Observer的onChanged,开发者只需onChanged等待最新数据回调即可。

public class MyActivity extends AppCompatActivity {
    public void onCreate(Bundle savedInstanceState) {
        MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
        model.getUsers().observe(this, users -> {
            // update UI
        });
    }
}

四、小结

当你更新LiveData对象中存储的数据时,所有注册了的Observer,只要所绑定的LifecycleOwner处于活动状态,就会被触发通知。LiveData允许UI控制器Observer订阅更新。 当LiveData对象所保存的数据发生变化时,UI会在响应中自动更新。

 通常情况下,LiveData只在数据有变化时,给活跃的Observer进行通知。 此行为的一个例外是,Observer在从非活跃状态变为活跃状态时也会收到通知。 并且,如果Observer第二次从非活跃状态变为活跃状态,则只有在自上一次变为活跃状态以来该数据发生变化时才会接收到更新。

更多了解,请参考以下博文:

Android应用结构之LiveData  https://www.jianshu.com/p/87aa6464412b

Google I/O Android官方新体系架构之:Lifecycle https://blog.csdn.net/zhangphil/article/details/77049812

Android架构组件ViewModel来龙去脉 :https://www.colabug.com/2630645.html

你可能感兴趣的:(api)