id:text="@{viewModel.loginPrompt}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/til_password" />
</android.support.constraint.ConstraintLayout>
</layout>
ViewModel
public class LoginViewModel extends ViewModel {
private static final String TAG = "LoginViewModel";
private final MutableLiveData<Boolean> isLoading = new MutableLiveData<>();
private final MutableLiveData<Account> account = new MutableLiveData<>();
private final MutableLiveData<String> loginPrompt = new MutableLiveData<>();
public LoginViewModel(){
account.postValue(new Account("",""));
isLoading.postValue(false);
}
public void login(View view){
String loginMsg = "accountNum = " + Objects.requireNonNull(account.getValue()).getAccountNum().getValue()
+ "\npassword = " + Objects.requireNonNull(account.getValue()).getPassword().getValue();
Log.d(TAG,"\n正在登陆中....\n"
+ loginMsg);
loginPrompt.postValue("正在登陆账号:" + Objects.requireNonNull(account.getValue()).getAccountNum().getValue());
isLoading.postValue(true);
new Handler().postDelayed(() -> {
Log.d(TAG,"登陆成功....\n");
isLoading.postValue(false);
Intent intent = new Intent(view.getContext(), MainActivity.class);
intent.putExtra("hello", loginMsg);
view.getContext().startActivity(intent);
loginPrompt.postValue("");
}, 2000);
}
public MutableLiveData<Boolean> getIsLoading(){
return isLoading;
}
public Account getAccount(){
return account.getValue();
}
public MutableLiveData<String> getLoginPrompt() {
return loginPrompt;
}
}
Activity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setHello(getIntent().getStringExtra("hello") + "\n hello word !");
binding.setLifecycleOwner(this);
}
}
到这里,我们就能愉快地Data Binding Compiler V2了。
从测试代码可以看出,代码和我们使用Data Binding Compiler V1的时候差不多,有区别的地方只有两点:
- ObservableField替换成LiveData
- binding对象需要调用setLifecycleOwner(LifecycleOwner lifecycleOwner
)设置lifecycleOwner对象。
示例代码
笔者在GitHub上面建立了一个项目,以后所有的文章的测试DEMO都会上传到这个项目上,有兴趣的读者可以关注下。
这篇文章的示例在项目中的todoDatabinding文件下。
项目结构如图所示:
其中databindingcompilerv1为Data Binding Compiler V1下的示例代码
其中databindingcompilerv2为Data Binding Compiler V2下的示例代码
Data Binding Compiler V2 示例代码
小结
Data Binding Compiler V2主要是解决了Data Binding不能感知View层生命周期的问题。
在Android开发中我们的控制层(这里指ViewModel)的生命周期和View层组件的生命周期是不能保持一致的,大多数情况下,控制层的生命周期会比View层长。例如,我们发起网络请求的时候,在请求回调之前View有被销毁的可能,如果在View被销毁后控制层再更新View层,这个时候我们就会遇到讨厌的NPE异常。Lifecycle系列组件的主要功能就是使控制层能够感知View层的生命周期。而Data Binding Compiler V2则是为了使Data Binding能够使用Lifecycle中的LiveData从而获得感知生命周期的能力,即达成Data Binding 的lifecycle-aware。
关于我
GitHub
微信公众号:
如果你觉得这片文章对你有所启发的话,可以关注我的微信公众号哦