一、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/zh-tw/n/152097.html