MVP全称是Model,View,Presenter
- View层:视图层,如Activity,Fragment,View,Adapter等,专注于用户的交互。View层一般会持有Presenter层的引用,或者也可以通过依赖注入(如Dagger)的方式获得Presenter的实例。
- Presenter层:逻辑控制层,用来隔离View层和Model层,如接收View层的网络数据加载请求,并分发给对应的Model处理,同时监听Model层的处理结果,最终将其反馈给View层,从而实现界面的刷新。
- Model层:封装各种数据来源,如远程网络数据,本地数据库数据,对Presenter层提供简单易用的接口。
MVP中View层和Model层并没有直接通信,而是通过中间人Presenter来间接通信;Presenter和View以及Model的交互都是通过接口进行的。通常View和Presenter是一对一的,当然,复杂的View可能需要多个Presenter来共同处理。
MVC中Model层和View层是直接通信的,而且Controller是基于行为的,可以被多个View共享。
MVP开源实现
MVVM(Model-View-ViewModel)
相比MVP模式,MVVM将Presenter改为了ViewModel,同时实现View和ViewModel的双向绑定。View层的变化会自动导致ViewModel发生变化,ViewModel的数据变化也会自动实现View的刷新,
在Google I/O2015大会上,Android开发团队发布了官方的MVVM模式支持函数库Data Binding Library。Data Binding函数库的引入很简单,在使用到Data Binding的android module的build.gradle文件中加入下面的配置即可
android {
dataBinding {
enabled = true;
}
}
Data Binding的布局以<layout>作为根布局标签,里面包含data和view两个标签,其中data标签用来实现数据绑定,view标签就是在没有使用Data Binding时这个页面的布局文件的根标签。
- Data Binding表达式
<?xml version='1.0' encoding='utf-8' ?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.shuixiu.example.User" />
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout>
</layout>
- 数据对象
public class User {
public final String firstName;
public final String lastName;
public User(String firstName,String lastName){
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
- 数据绑定
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.main_activity);
MainActivityBinding binding = DataBindingUtil.setContentView(this,R.layout.main_activity);
// MainActivityBinding binding1 = MainActivityBinding.inflate(getLayoutInflater());
// 如果在ListView或者RecyclerView的adapter中使用数据绑定,可以如下方式绑定
// ListItemBinding binding = ListItemBinding.inflate(layoutInflater,viewGroup,false);
// ListItemBinding binding = DataBindingUtil.inflate(layoutInflater,R.layout.list_item,viewGroup,false);
User user = new User("Test","User");
binding.setUser(user);
}
}
- 事件绑定
<?xml version='1.0' encoding='utf-8' ?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.shuixiu.example.User" />
<variable
name="handlers"
type="com.shuixiu.example.MyHandlers"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
android:onClick="@{user.isFriend? handlers.onClickFriend:handlers.onClickEnemy}"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"
android:onClick="@{user.isFriend? handlers.onClickFriend:handlers.onClickEnemy}"/>
</LinearLayout>
</layout>
《Android高级进阶》第16章 MVP模式及其在Android中的实践
《Android高级进阶》第17章 MVVM模式及Android DataBinding实战
网友评论