一、什么是LiveData。
LiveData 是可观察的数据持有者类。与常规的可观察对象不同,LiveData具有生命周期感知功能,这意味着它尊重其他应用程序组件(例如活动,片段或服务)的生命周期。这种意识确保LiveData仅更新处于活动生命周期状态的应用程序组件观察者。
如果LiveData的Observer生命周期处于STARTEDor RESUMED 状态,则它认为由类表示的观察者 处于活动 状态。LiveData仅将有关更新的信息通知活动的观察者。LiveData未注册观察对象的不活动观察者 不会收到有关更改的通知。
您可以注册一个与实现该LifecycleOwner 接口的对象配对的观察者 。这种关系允许在相应Lifecycle对象的状态更改 为时删除观察者 DESTROYED。这对于活动和碎片特别有用,因为它们可以安全地观察LiveData对象,而不必担心泄漏-活动和碎片在其生命周期被破坏时会立即取消订阅。
二、使用LiveData的优点
1、确保您的用户界面与数据状态匹配
LiveData遵循观察者模式。Observer生命周期状态更改时,LiveData会通知 对象。您可以合并代码以更新这些Observer对象中的UI 。观察者可以在每次更改应用程序时更新UI,而不是在每次应用程序数据更改时都更新UI。(其实说的是activity处于不可见状态时就不进行数据更新,而是等它可见时再更新)
2、没有内存泄漏
观察者绑定到 Lifecycle对象,并在其相关的生命周期被破坏时自行清理。
3、活动停止不会导致崩溃
如果观察者的生命周期处于非活动状态(例如在后堆栈中处于活动状态),则它不会收到任何LiveData事件。
4、不再需要人工生命周期处理
UI组件仅观察相关数据,而不会停止或继续观察。LiveData自动管理所有这些,因为它在观察的同时知道相关生命周期状态的变化。
5、始终最新的数据
如果生命周期变为非活动状态,则在再次处于活动状态时它将接收最新数据。例如,在后台的活动返回到前台后立即接收最新数据。
6、正确的配置更改
如果由于配置更改(例如设备旋转)而重新创建活动或片段,则该活动或片段将立即接收最新的可用数据。
7、共享资源
您可以LiveData 使用单例模式扩展对象以包装系统服务,以便可以在您的应用程序中共享它们。该LiveData对象一次连接到系统服务,然后任何需要资源的观察者都可以监视该LiveData 对象。
三、使用LiveData对象
请按照以下步骤操作 LiveData对象:
1、创建一个实例LiveData来保存某种类型的数据。这通常在您的ViewModel类中完成 。
2、创建一个Observer 定义onChanged() 方法的对象,该 方法控制当LiveData对象的保留数据更改时发生的情况。通常,您可以Observer在UI控制器中创建对象,例如activity或fragment。
3、使用 方法将Observer对象附加到对象。该方法带有一个 对象。这会将对象订阅到该对象,以便通知更改。通常,您将对象附加在UI控制器中,例如活动或片段。
代码示例:
public class NameViewModel extends ViewModel {
private MutableLiveData<String> currentName;
public MutableLiveData<String> getCurrentName() {
if (currentName == null) {
currentName = new MutableLiveData<>();
}
return currentName;
}
}
public class TestActivity extends AppCompatActivity {
private NameViewModel nameViewModel;
private TextView text;
private int n;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
text = findViewById(R.id.text);
text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
n++;
nameViewModel.getCurrentName().setValue("第" + n + "次点击");
}
});
//获取viewModel
nameViewModel = ViewModelProviders.of(this).get(NameViewModel.class);
//创建用于更新UI的观察器
Observer<String> nameObserver = new Observer<String>() {
@Override
public void onChanged(String s) {
text.setText(s);
}
};
//观察liveData
nameViewModel.getCurrentName().observe(this, nameObserver);
}
}
如上就是LiveData的简单使用,当然,我们肯定不会为了更新一个TextView而写这么一大顿代码,它的真正使用是配合着别的JetPack组件使用的比如Room组件等。也有人基于LiveData特性写出LiveDataBus来代替EventBus的等等。