写在之前:
众所周知, onSaveInstanceState()
方法是用来存储简单、轻量级的视图状态,以键值对的形式存贮基础数据类型和可序列化数据。
其解决的问题:当活动即将停止(例如:APP 横竖屏切换或分屏时),保存数据。
问题随之而来,其不适用于潜在的大量数据,如用户列表或位图或网络请求数据,这时ViewModel诞生了。
同时,她可以在 fragments 之间共享数据。
开始:
1、ViewModel的贯穿于 activity 的生命周期,开始至销毁;
2、创建
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. } }
3、创建
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 = ViewModelProviders.of(this).get(MyViewModel.class); model.getUsers().observe(this, users -> { // update UI }); } }
4、Share data between fragments
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 onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class); itemSelector.setOnClickListener(item -> { model.select(item); }); } } public class DetailFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class); model.getSelected().observe(this, { item -> // Update the UI. }); } }
结束语:ViewModel 不能持有 activity 的context。
A ViewModel
must never reference a view, Lifecycle
, or any class that may hold a reference to the activity context.