MVVM
数据双向绑定,通过数据驱动UI,M提供数据,V视图,VM即数据驱动层
MVP框架图 (图片来源于网络)
学习MVVM开发框架,要先了解DataBinding,DataBinding 是什么?
DataBinding是谷歌官方发布的一个实现数据绑定的框架(实现数据与视图双向绑定)。
DataBinding可以帮助我们在安卓中更好的实现MVVM模式。
DataBinding 使用步骤
1.启动DataBinding
app中的build.gradle 中的android{}里面添加
dataBinding{
enabled=true
}
2.修改布局文件为DataBinding布局
选择 LinearLayout ,然后Alt+回车键 ,选择data binding layout
改成layout
3.数据绑定
xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewModel"
type="com.rain.mvvm_demo.view.ViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
tools:context=".mvvm.MvvmActivity">
<EditText
android:id="@+id/et_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入框"/>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取内容"
android:onClick="@{viewModel.getData}"/>
<TextView
android:id="@+id/content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.result}"/>
</LinearLayout>
</layout>
案例
逻辑代码
CallBack
/**
* 数据返回接口
*/
public interface CallBack {
void onSuccess(Account account);
void onFailed();
}
Account 实体类
public class Account extends BaseObservable {
private String name;
private int level;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Bindable
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
notifyPropertyChanged(BR.level);
}
}
MvvmModel model层
public class MvvmModel {
public void setAccountData(String accountName, CallBack callBack){
Random random=new Random();
boolean isSuccess=random.nextBoolean();
if (isSuccess){
Account account=new Account();
account.setName(accountName);
account.setLevel(100);
callBack.onSuccess(account);
}else {
callBack.onFailed();
}
}
}
ViewModel vm
public class ViewModel extends BaseObservable {
private MvvmModel mvvmModel;
private String result;
ActivityMainBinding binding;
Application application;
public ViewModel(Application application) {
mvvmModel=new MvvmModel();
}
public ViewModel(Application application, ActivityMainBinding binding) {
this.application=application;
mvvmModel=new MvvmModel();
this.binding=binding;
}
public void getData(View view){
switch (view.getId()){
case R.id.btn:
String userInput=binding.etText.getText().toString();
mvvmModel.setAccountData(userInput, new CallBack() {
@Override
public void onSuccess(Account account) {
String info=account.getName()+"|"+account.getLevel();
setResult(info);
}
@Override
public void onFailed() {
setResult("获取数据失败");
}
});
break;
default:
break;
}
}
@Bindable
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
notifyPropertyChanged(BR.result);
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding= DataBindingUtil.setContentView(this, R.layout.activity_main);
ViewModel viewModel=new ViewModel(getApplication(),binding);
binding.setViewModel(viewModel);
}
}
MVVM 优缺点
优点
1. 减少了接口数量
2.告别繁琐FindViewById 操作
3.实现了数据和视图的双向绑定,极大的简化代码
缺点
bug难以调试,并且dataBinding目前还存在一些编译问题,不过MVVM
会越来越好,值得学习,极力推荐。
LiveData+ViewModel
代码获取
公众号: 轻语积累
回复关键字: 源码