ViewModel與LiveData如何監聽數據變化更新試圖


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;
    }
}
View Code

 ((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;
    }
}
View Code

 

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初始化的

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM