2.LiveData

MyJetpackStudy: jetpack学习 (gitee.com)

1.什么是LiveData

1
2
3
4
5
LiveData是Jetpack组件的一部分,更多的时候是搭配ViewModel来使用,相对于Observable,LiveData的最大优势是其具有生命感知的,
换句话说,LiveData可以保证只有在组件( Activity、Fragment、Service)处于活动生命周期状态的时候才会更新数据。
LiveData是一个可观察的数据持有者类,与常规的Observable不同,LiveData可感知Activity、Fragment、Service的生命周期,确保
LiveData仅更新处于活动生命周期状态的组件观察者。如果应用程序组件观察者处于started或者resumed,则LiveData认为该组件处于
活跃状态,该组件会收到LiveData的数据更新,而其他注册的组件观察者将不会收到任何数据更新。

LiveData的优点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1.确保界面符合数据状态
LiveData 遵循观察者模式。当底层数据发生变化时,LiveData 会通知 Observer 对象。您可以整合代码以在这些 Observer 对象中
更新界面。这样一来,您无需在每次应用数据发生变化时更新界面,因为观察者会替您完成更新。
2.不会发生内存泄漏
观察者会绑定到 Lifecycle 对象,并在其关联的生命周期遭到销毁后进行自我清理。
3.不会因 Activity 停止而导致崩溃
如果观察者的生命周期处于非活跃状态(如返回堆栈中的 activity),它便不会接收任何 LiveData 事件。
4.不再需要手动处理生命周期
界面组件只是观察相关数据,不会停止或恢复观察。LiveData 将自动管理所有这些操作,因为它在观察时可以感知相关的生命周期状态变化。
5.数据始终保持最新状态
如果生命周期变为非活跃状态,它会在再次变为活跃状态时接收最新的数据。例如,曾经在后台的 Activity 会在返回前台后立即接收最新的
数据。
6.适当的配置更改
如果由于配置更改(如设备旋转)而重新创建了 activity 或 fragment,它会立即接收最新的可用数据。
7.共享资源
您可以使用单例模式扩展 LiveData 对象以封装系统服务,以便在应用中共享它们。LiveData 对象连接到系统服务一次,然后需要相应资
源的任何观察者只需观察 LiveData 对象。

使用 LiveData 对象

1
2
3
4
5
6
7
8
9
10
11
12
请按照以下步骤使用LiveData对象:

1. 创建 LiveData的实例以存储某种类型的数据。这通常在ViewModel类中完成。

2. 创建可定义 onChanged()对象,该方法可以控制当LiveData对象存储的数据更改时会发生什么。通常情况下,您可以在界面控制器
(如 activity 或 fragment)中创建 Observer对象。

3. 使用 observe()方法将Observer对象附加到 LiveData对象。observe()方法会采用LifecycleOwner对象。这样会使Observer对象
订阅LiveData对象,以使其收到有关更改的通知。通常情况下,您可以在界面控制器(如 activity 或 fragment)中附加Observer对象。

当您更新存储在LiveData对象中的值时,它会触发所有已注册的观察者(只要附加的LifecycleOwner处于活跃状态)。
LiveData允许界面控制器观察者订阅更新。当LiveData对象存储的数据发生更改时,界面会自动更新以做出响应。

LiveData的使用

常用方法:

方法名 作用
setValue(T value): 设置 LiveData 的值,并通知所有活跃的观察者进行更新。此方法应在主线程中调用
postValue(T value) 与setValue()类似,但可以在任何线程中调用。内部使用 Handler 来确保更新操作在主线程执行。
getValue() 获取当前 LiveData 实例的值
observe(LifecycleOwner owner, Observer<? super T> observer) 将观察者(Observer)添加到 LiveData。当 LiveData 的值发生变化时,会通知观察者。该方法传入一个 LifecycleOwner 对象(如 Activity 或 Fragment),LiveData 将观察者与该 LifecycleOwner 的生命周期关联起来,以自动管理观察者的注册和取消注册。
hasObservers() 检查 LiveData 是否有活跃的观察者。
removeObserver(Observer<? super T> observer) 从 LiveData 中移除观察者。
observeForever(Observer<? super T> observer) 与 observe()类似,但观察者不会自动注销。需要手动调用 removeObserver()方法来取消观察。

简单示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class NameViewModel extends ViewModel {
// 使用字符串创建LiveData
private MutableLiveData<String> currentName;
public MutableLiveData<String> getCurrentName() {
if (currentName == null) {
currentName = new MutableLiveData<String>();
}
return currentName;
}
}

public class LiveDataActiviry extends BaseActivity {
private NameViewModel model;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=findViewById(R.id.button);
Button button2=findViewById(R.id.button2);
model = new ViewModelProvider(this).get(NameViewModel.class);
// 创建用于更新UI的观察者
Observer<String> nameObserver = new Observer<String>() {
@Override
public void onChanged(@Nullable String newName) {
// 更新UI
button.setText(newName);
}
};
// 观察LiveData,将此活动作为LifecycleOwner和observer传入
model.getCurrentName().observe(this, nameObserver);
//更新LiveData对象的值
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String anotherName = "John Doe";
//主线程传值
model.getCurrentName().setValue(anotherName);
//子线程传值
// new Thread(new Runnable() {
// @Override
// public void run() {
// model.getCurrentName().postValue("anotherName");
// }
// }).start();
}
});
}
}