編寫說明,文章收錄于《Android Jetpack》,文章將大部分摘錄于
官方教程
ViewModel
ViewModel 類旨在以注重生命周期的方式存儲和管理界面相關(guān)的數(shù)據(jù)。ViewModel 類讓數(shù)據(jù)可在發(fā)生屏幕旋轉(zhuǎn)等配置更改后繼續(xù)留存
界面控制器雷點
- 系統(tǒng)銷毀或重新創(chuàng)建界面控制器,則存儲在其中的任何瞬態(tài)界面相關(guān)數(shù)據(jù)都會丟失
- 界面控制器經(jīng)常需要進行可能需要一些時間才能返回的異步調(diào)用。界面控制器需要管理這些調(diào)用,并確保系統(tǒng)在其銷毀后清理這些調(diào)用以避免潛在的內(nèi)存泄漏
實現(xiàn) ViewModel
public class MyViewModel extends ViewModel {
private MutableLiveData<List<User>> users;
public LiveData<List<User>> getUsers() {
if (users == null) {
users = new MutableLiveData<List<User>>();
loadUsers();
}
return users;
}
private void loadUsers() {
// Do an asynchronous operation to fetch users.
}
}
public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
// Create a ViewModel the first time the system calls an activity's onCreate() method.
// Re-created activities receive the same MyViewModel instance created by the first activity.
MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
}
}
如果重新創(chuàng)建了該 Activity,它接收的 MyViewModel 實例與第一個 Activity 創(chuàng)建的實例相同。當所有者 Activity 完成時,框架會調(diào)用 ViewModel 對象的 onCleared() 方法,以便它可以清理資源。
ViewModel 的生命周期

viewmodel-lifecycle.png
您通常在系統(tǒng)首次調(diào)用 Activity 對象的
[onCreate()](https://developer.android.google.cn/reference/android/app/Activity#onCreate(android.os.Bundle)) 方法時請求 ViewModel。系統(tǒng)可能會在 activity 的整個生命周期內(nèi)多次調(diào)用 [onCreate()](https://developer.android.google.cn/reference/android/app/Activity#onCreate(android.os.Bundle)),如在旋轉(zhuǎn)設(shè)備屏幕時。ViewModel 存在的時間范圍是從您首次請求 ViewModel 直到 activity 完成并銷毀。
在 Fragment 之間共享數(shù)據(jù)
public class SharedViewModel extends ViewModel {
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
public void select(Item item) {
selected.setValue(item);
}
public LiveData<Item> getSelected() {
return selected;
}
}
public class MasterFragment extends Fragment {
private SharedViewModel model;
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
itemSelector.setOnClickListener(item -> {
model.select(item);
});
}
}
public class DetailFragment extends Fragment {
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
model.getSelected().observe(getViewLifecycleOwner(), item -> {
// Update the UI.
});
}
}