之前项目中多次使用了MVP模式,今天我也来分享下关于MVP 的使用心得,
废话不多说,直接挑干货来,
首先来简单介绍下mvp
从图中可以直观的看出,view 与model 完全解耦,
MVP模式的核心思想:
MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成Presenter接口,Model类还是原来的Model。
具体使用方法如下
1)项目结构
2)建立UserBean用于存放数据实体
public class UserBean {
private String userName;
private String userTel;
public UserBean(String userName, String userTel) {
this.userName = userName;
this.userTel = userTel;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserTel() {
return userTel;
}
public void setUserTel(String userTel) {
this.userTel = userTel;
}
}
3)Model层实现
model通过接口回调 通知presenter网络加载结果
//model 接口
public interface MvpModel {
void loadUser(String userName, BaseCallBack callBack);
}
//model实现类,
public class MvpModeImpl implements MvpModel {
@Override
public void loadUser(String userName, final BaseCallBack callBack) {
//此处使用Retrofit2.0加载网络数据,关于Retrofit2.0使用
//详见我的微博《Retrofit2.0使用详解》
Call<UserBean> call = MyApplication.loadUtils.getUserInfo(userName);
call.enqueue(new Callback<UserBean>() {
@Override
public void onResponse(Call<UserBean> call, Response<UserBean> response) {
// callBack.loadSuccess(response.body());
UserBean bean = new UserBean("userName", "123456");
callBack.loadSuccess(bean);
}
@Override
public void onFailure(Call<UserBean> call, Throwable t) {
callBack.loadError("加载失败");
}
});
}
}
4)Presenter 层实现
通过model 对象调用对应数据加载方法,传递BaseCallBack,回调通知view 相关方法更新ui
**
* Presenter ,持有 model 和view 引用
*/
public class MvpPresenter {
MvpModel model;
MvpBaseView view;
public MvpPresenter(MvpBaseView view) {
this.view = view;
model = new MvpModeImpl();
}
public void loadUser(String userName) {
model.loadUser(userName, new BaseCallBack() {
@Override
public void loadSuccess(Object o) {
view.upDateView(o);
}
@Override
public void loadError(String errorMsg) {
view.showMsg(errorMsg);
}
});
}
}
5)View 层实现
建立view接口(更新ui中的view状态)
public interface MvpBaseView {
//加载成功更新view
void upDateView(Object o);
//显示错误信息
void showMsg(String msg);
}
6)Activity Fragment 具体实现
Activity 或Fragment 中实现iview接口,在其中操作view,
实例化一个presenter对象。
activity_main.xml只有2个TextView 代码忽略
public class MainActivity extends AppCompatActivity implements MvpBaseView {
private TextView name, tel;
private MvpPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
//初始化view
private void initView() {
name = (TextView) findViewById(R.id.name);
tel = (TextView) findViewById(R.id.tel);
}
//初始化data
private void initData() {
presenter = new MvpPresenter(this);
presenter.loadUser("test");
}
//更新ui方法
@Override
public void upDateView(Object o) {
UserBean bean = (UserBean) o;
if (bean != null) {
name.setText(bean.getUserName());
name.setText(bean.getUserTel());
}
}
@Override
public void showMsg(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
}
7)总结
所谓的mvp,即是(model-处理业务逻辑(主要是数据读写,或者与后台通信),view-处理ui控件,presenter-主导器,操作model和view)
Activity 或Fragment 实现View接口,创建 presenter对象,并将view引用传递给presenter,调用preserter方法加载数据
presenter持有view引用,创建model实例,通过model实例调用model读写数据方法,并传递回调接口引用,presenter等待model 读写结束,通知view 更新UI
model类读写数据(网络或SQlite等方式),通过callBack对象通知presernter
Tips
mvp使用的优点就是老生常谈的oop编程追求的高内聚,低耦合,提高可维护性,多人员开发同一项目互不冲突
但缺点也是显而易见,由于项目业务逻辑越来越复杂,会多出很多接口类,项目体积变大
为了避免过度设计,请酌情使用mvp设计模式进行项目开发。
代码地址:(https://github.com/lc615762546/AndroidMVPDemo)
//更多精彩技术分享请关注我的微博 谢谢