ViewModel用來可感知生命周期的方式存儲和管理UI相關數據,當系統配置發生變更的時候,如屏幕旋轉,數據不會丟失。
主要步驟:
1.ViewModel關聯了數據LiveData

public class HomeViewModel extends ViewModel { private MutableLiveData<String> mText; public HomeViewModel() { mText = new MutableLiveData<>(); mText.setValue("This is home fragment"); } public LiveData<String> getText() { return mText; } }
((MutableLiveData<String>)homeViewModel.getText()).postValue("");寫在onCreateView中肯定是不合適的,不要介意這個。😋
2.在activity或者fragment中,通過ViewModal的LiveData,在在activity或者fragment上注冊監聽Observer,Observer的回調方法中執行視圖更新。

public class HomeFragment extends BaseFragment { String TAG="TAGHomeFragment"; private HomeViewModel homeViewModel; public HomeFragment(){ super.TAG = this.TAG; Log.i(TAG, "HomeFragment: "); } public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.i(TAG, "onCreateView: "); homeViewModel = new ViewModelProvider(this).get(HomeViewModel.class); View root = inflater.inflate(R.layout.fragment_home, container, false); final TextView textView = root.findViewById(R.id.text_home); homeViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() { @Override public void onChanged(@Nullable String s) { textView.setText(s); } }); ((MutableLiveData<String>)homeViewModel.getText()).postValue(""); return root; } }
3.ViewModal的LiveData通過postValue,最終會執行Observer的回調方法
((MutableLiveData<String>)homeViewModel.getText()).postValue("");
接下來我們來耕種一下代碼,從((MutableLiveData<String>)homeViewModel.getText()).postValue("");開始。
1)執行postValue
2.在postValue中,把數據value放在了mPendingData上;並通過線程mPostValueRunnable執行更新
3)mPostValueRunnable把mPendingData賦值給newValue,然后執行setValue
4)setValue把數據放在了mData上,並執行dispatchingValue
5)再執行considerNotify
6)considerNotify中會執行mObserver的onChange回調方法。onChange的實現在activity或者fragment中,這樣就可以更新試圖
7)最后在看mObserver怎么來的。
是通過在activity或者fragment注冊監聽的時候,把mObserver初始化的