一、LiveData是什么?
LiveData是一个支持生命周期感知型的持有数据的类。LiveData为您的应用程序提供了一种强大的手段来参照Activity、Fragment或Service等组件的生命周期状态,并触发合适的生命周期事件,以便更新UI元素。LiveDate中的数据变化后,可以通知监听器(Observer,也就是观察者),Observer将会在LiveData处于激活状态时触发,这有助于构建具有响应式UI和更具生命周期意识的应用程序。LiveData旨在解决经典Lifecycle对象生命周期感知型业务对象与它们的观察者之间的意外混杂问题。
二、LiveData与MutableLiveData的区别
LiveData的数据无法更改,但MutableLiveData更像普通数据,您可以更改它的值。 也就是说,LiveData的值只是订阅者Observer直接观察到的内容;不能通过代码的方式来修改。而MutableLiveData是LiveData的一个子类,是一种可以修改的LiveData。当观察到它的数据发生变换时,会通知到所有观察者。
三、 LiveData使用方法
private LiveData data = new MutableLiveData();
以上定义了一个携带Integer类型数据的LiveData。此时实际上是一个空数据,还需要一个Observer(观察者)把数据“看守”起来。下面是一个绑定数据的方法:
data.observe(this, new Observer() {
@Override
public void onChanged(@Nullable Integer integer) {
//数据变化后,会回调这里
tvResult.setText(integer.toString());
}
});
这里的observe函数的第一个参数为LifecycleOwner,一般是继承于LifecycleOwner的Activity或Fragment。LiveData会跟随该组件的生命周期而变化。 第二个参数为Observer,就是观察者的回调函数,每次数据更新后都会触发该函数。
四、LiveData与Room的结合
既然LiveData本身就是为处理生命周期而出现的,自然而然的和Room(SQLite的ORM框架)进行了结合,用以更好的处理数据变化。
Room所使用的LiveData类,可看作是一个包装器。 Room中的每一个查询方法(如查询、插入、更新和删除)返回一个LiveData对象,即可将Room数据库中的数据封装到LiveData对象中。
下面是一个运用LiveData和Room实现add、delete和query操作的完整代码示例:
public class UserDao {
private LiveData<List> allUsers;
UserDao(AppDatabase database) {
allUsers = database.userDao().getAllUsers();
}
public LiveData<List> getAllUsers() {
return allUsers;
}
public void insertUser(final User user) {
AppDatabase.databaseExecutor.execute(new Runnable() {
@Override
public void run() {
appDatabase.userDao().insertUser(user);
}
});
}
public void updateUser(final User user) {
AppDatabase.databaseExecutor.execute(new Runnable() {
@Override
public void run() {
appDatabase.userDao().updateUser(user);
}
});
}
public void deleteUser(final User user) {
AppDatabase.databaseExecutor.execute(new Runnable() {
@Override
public void run() {
appDatabase.userDao().deleteUser(user);
}
});
}
}
public class MainActivity extends AppCompatActivity {
private UserViewModel userViewModel;
private TextView tvResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvResult = findViewById(R.id.tvResult);
userViewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication())
.create(UserViewModel.class);
userViewModel.getAllUsers().observe(this, new Observer<List>() {
@Override
public void onChanged(List users) {
StringBuilder stringBuilder = new StringBuilder();
for (User user : users) {
stringBuilder.append(user.toString()).append("\n");
}
tvResult.setText(stringBuilder.toString());
}
});
}
public void addUser(View view) {
User user = new User();
user.setFirstName("John");
user.setLastName("Doe");
userViewModel.insertUser(user);
}
public void updateUser(View view) {
// 更新id==2的用户的信息,比如修改名字为Harry
User user = new User();
user.setId(2);
user.setFirstName("Harry");
user.setLastName("Potter");
userViewModel.updateUser(user);
}
public void deleteUser(View view) {
//删除id==1的用户信息
User user = new User();
user.setId(1);
userViewModel.deleteUser(user);
}
}
五、LiveData的优点
1、UI界面更新变得更简单,不需要手动去更新ui。
2、数据显示和生命周期绑定处理得更好,不用再担心Activity或者Fragment销毁后的内存泄漏。
3、更加适合于给多个UI展示想同数据的处理场景。
4、LiveData原生支持进程数据或者Activity或者Fragment之间的数据通信的处理。
六、 LiveData的局限性
LiveData不能够被序列化,也就是说,不能把LiveData存储在持久化数据存储中,也不能在间隔Activity传递。
不过MutableLiveData的值是可以修改的,因此可以使用setValue和postValue方法更新数据。postValue方法可以在非UI线程调用,而setValue方法只能在UI线程中调用。
七、总结
LiveData是一个非常实用的持有数据的类,提供了强大的手段来参照Activity、Fragment或Service等组件的生命周期状态,并触发对应的生命周期事件,以便更新UI元素。LiveData的优点有很多,使用LiveData可以极大的简化UI更新操作,在数据显示和生命周期绑定方面都能发挥巨大的作用。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/152097.html
微信扫一扫
支付宝扫一扫