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><variablename="viewModel"type="com.rain.mvvm_demo.view.ViewModel" /></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"tools:context=".mvvm.MvvmActivity"><EditTextandroid:id="@+id/et_text"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="输入框"/><Buttonandroid:id="@+id/btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="获取内容"android:onClick="@{viewModel.getData}"/><TextViewandroid: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;}@Bindablepublic 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() {@Overridepublic void onSuccess(Account account) {String info=account.getName()+"|"+account.getLevel();setResult(info);}@Overridepublic void onFailed() {setResult("获取数据失败");}});break;default:break;}}@Bindablepublic String getResult() {return result;}public void setResult(String result) {this.result = result;notifyPropertyChanged(BR.result);}
}
MainActivity
public class MainActivity extends AppCompatActivity {ActivityMainBinding binding;@Overrideprotected 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
代码获取
关注微信公众号: 轻语积累
回复关键字: 源码