使用LiveData对象
请按照以下步骤使用 [LiveData
]对象:
- 创建
LiveData
的实例以存储某种类型的数据。这通常在 [ViewModel
] 类中完成。 - 创建可定义 [
onChanged()
] 方法的 [Observer
]对象,该方法可以控制当LiveData
对象存储的数据更改时会发生什么。通常情况下,您可以在界面控制器(如 Activity 或 Fragment)中创建Observer
对象。 - 使用 [
observe()
] 方法将Observer
对象附加到LiveData
对象。observe()
方法会采用 [LifecycleOwner
](htt对象。这样会使Observer
对象订阅LiveData
对象,以使其收到有关更改的通知。通常情况下,您可以在界面控制器(如 Activity 或 Fragment)中附加Observer
对象。
当您更新存储在 LiveData
对象中的值时,它会触发所有已注册的观察者(只要附加的 LifecycleOwner
处于活跃状态)。
LiveData 允许界面控制器观察者订阅更新。当 LiveData
对象存储的数据发生更改时,界面会自动更新以做出响应。
创建 LiveData 对象
LiveData 是一种可用于任何数据的封装容器,其中包括可实现 Collections
的对象,如 List
。[LiveData
] 对象通常存储在 [ViewModel
] 对象中,并可通过 getter 方法进行访问,如以下示例中所示:
public class ViewModelWithLiveData extends ViewModel {
private MutableLiveData<Integer> LikedNumber;
public MutableLiveData<Integer> getLikedNumber() {
if (LikedNumber == null) {
LikedNumber = new MutableLiveData<>();
LikedNumber.setValue(0);
}
return LikedNumber;
}
public void add(int n) {
LikedNumber.setValue(LikedNumber.getValue() + n);
}
}
观察 LiveData 对象
在大多数情况下,应用组件的 onCreate()
方法是开始观察 [LiveData
] 对象的正确着手点,原因如下:
- 确保系统不会从 Activity 或 Fragment 的
onResume()
方法进行冗余调用。 - 确保 Activity 或 Fragment 变为活跃状态后具有可以立即显示的数据。一旦应用组件处于 [
STARTED
] 状态,就会从它正在观察的LiveData
对象接收最新值。只有在设置了要观察的LiveData
对象时,才会发生这种情况。
通常,LiveData 仅在数据发生更改时才发送更新,并且仅发送给活跃观察者。此行为的一种例外情况是,观察者从非活跃状态更改为活跃状态时也会收到更新。此外,如果观察者第二次从非活跃状态更改为活跃状态,则只有在自上次变为活跃状态以来值发生了更改时,它才会收到更新。
public class MainActivity extends AppCompatActivity {
ViewModelWithLiveData viewModelWithLiveData;
TextView textView;
ImageButton imageButtonRun, imageButtonStop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
imageButtonRun = findViewById(R.id.imageButton3);
imageButtonStop = findViewById(R.id.imageButton4);
// viewModelWithLiveData = ViewModelProviders.of(this).get(ViewModelWithLiveData.class); 老方法
viewModelWithLiveData = new ViewModelProvider(this).get(ViewModelWithLiveData.class);
//观察对象
viewModelWithLiveData.getLikedNumber().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
textView.setText(String.valueOf(integer));
}
});
//更新对象
imageButtonRun.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModelWithLiveData.add(1);
}
});
//更新对象
imageButtonStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModelWithLiveData.add(-1);
}
});
}
}
在传递 nameObserver
参数的情况下调用 [observe()
] 后,系统会立即调用 [onChanged()
],从而提供 mCurrentName
中存储的最新值。如果 LiveData
对象尚未在 mCurrentName
中设置值,则不会调用 onChanged()
。
也就是利用onChanged()来操作数据变化之后的操作
更新 LiveData 对象
LiveData 没有公开可用的方法来更新存储的数据。[MutableLiveData
] 类将公开 [setValue(T)
] 和 [postValue(T)
] 方法,如果您需要修改存储在 [LiveData
] 对象中的值,则必须使用这些方法。通常情况下会在 [ViewModel
] 中使用 MutableLiveData
,然后 ViewModel
只会向观察者公开不可变的 LiveData
对象。
设置观察者关系后,您可以更新 LiveData
对象的值(如以下示例中所示),这样当用户点按某个按钮时会触发所有观察者:
imageButtonRun.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModelWithLiveData.add(1); //添加操作
}
});