一、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