返回博主主页

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

 

 

 

 

posted @ 2022-03-12 21:43  懒惰的星期六  阅读(1599)  评论(0编辑  收藏  举报

Welcome to here

主页