Android DataBing基础使用 +ViewModel

Android DataBing基础使用 +ViewModel,第1张

模块内 build.gradle 添加dataBinding支持

android{
    ......
    dataBinding{
        enabled = true
    }
}

在布局 中  alt+回车  生成data binging layout  设置布局



    
    
        
        
        
        
        
        


        
        
    

    

        
        
       android:text="@{model.text}" />

        
        
    

 LoginModel类 

//继承ViewModel 或者 继承AndroidViewModel--> 主要看需不需要环境  因为点击事件已经通过Activity
//的内部类实现所以ViewModel够用  主要管理数据即可
public class LoginModel extends ViewModel {
    //使用MutableLiveData包裹数据 可以实现数据改变之后布局内自动更改
    private MutableLiveData text;
    public MutableLiveData getText() {
        if (text ==null){
            text = new MutableLiveData<>();
            text.setValue("");
        }
        return text;
    }

    public void setText(MutableLiveData text) {
        this.text = text;
    }
}

//后面为LiveDate实现的源码  以及去解决数据粘性的地方  可不看
//可以直接点进去源码   当赋值时调用了 setValue 或者postValue -->postValue用于异步赋值
public class MutableLiveData extends LiveData {
    public MutableLiveData(T value) {
        super(value);
    }

    public MutableLiveData() {
        super();
    }

    @Override
    public void postValue(T value) {
        super.postValue(value);
    }

    @Override
    public void setValue(T value) {
        super.setValue(value);
    }
}

//点击 setValue 到父级LiVeData的setValue方法
    @MainThread
    protected void setValue(T value) {
        assertMainThread("setValue");   //检查是否主线程
        mVersion++;
        mData = value;
        dispatchingValue(null);  //--去通知监听者
    }
//点击进去  dispatchingValue 
    void dispatchingValue(@Nullable ObserverWrapper initiator) {
        if (mDispatchingValue) {
            mDispatchInvalidated = true;
            return;
        }
        mDispatchingValue = true;
        do {
            mDispatchInvalidated = false;
            if (initiator != null) {
                considerNotify(initiator);
                initiator = null;
            } else {
                //这里去循环了所有的监听者
                for (Iterator, ObserverWrapper>> iterator =
                        mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
                    considerNotify(iterator.next().getValue());   //-->进入这里
                    if (mDispatchInvalidated) {
                        break;
                    }
                }
            }
        } while (mDispatchInvalidated);
        mDispatchingValue = false;
    }
//点击进去  considerNotify
    private void considerNotify(ObserverWrapper observer) {
        if (!observer.mActive) {
            return;
        }
        if (!observer.shouldBeActive()) {
            observer.activeStateChanged(false);
            return;
        }
        if (observer.mLastVersion >= mVersion) {   //如果想解决数据粘性问题 可以通过Hook去修改让这两个条件相等
            return;
        }
        observer.mLastVersion = mVersion;
        observer.mObserver.onChanged((T) mData);   //这里通知了监听者
    }

Activity内

public class LoginActivity extends BaseActivity {

    private ActivityLoginBinding bind;
    private LoginModelmodel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //通过DataBindingUtil设置ContentView 拿到对应的Binding类
        bind = DataBindingUtil.setContentView(this,R.layout.activity_login);
        //需要环境  继承 AndroidViewModel
      //  model = new ViewModelProvider(this,new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(LoginModel.class);
        //不需要环境 继承 ViewModel
        model = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(LoginModel.class);
        //绑定数据Model
        bind.setModel(model);
        //绑定点击事件内部类
        bind.setClick(new ClickLogin());
        //建立感应
        bind.setLifecycleOwner(this);
    }

    public class ClickLogin{
        public void toLogin(){
         Toast.makeText(mContext,"登录",Toast.LENGTH_SHORT).show();
        }
    }
}

我们的Activity继承自 AppCompatActivity 继承自 FragmentActivity 继承自 ComponentActivity

ComponentActivity实现了 ViewModelStoreOwner 和  LifecycleOwner  接口 所以可以直接传this

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/992899.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存