android实践个人总结报告,Android MVP模式实践总结(附带简单例子)

Android MVP模式实践总结(附带简单例子)

最近在做毕业设计,题目不是很难,但是后来发现功能有点多,感觉是苦力活,还好用的是设计MVP模式,虽然刚开始也不是特别理解,不过写的东西多就会发现这个模式的好处。

代码虽然好像多了,但思路非常清晰,敲代码的速度特别快,特别酸爽。

出现Bug很容易知道哪里出差错。

粽子,感觉开发效率快了,然后错误少了。

感觉,学MVP最好还是看下官方的介绍,如果英文过得去的话。

首先, 为什么不用传统的MVC(model, view, controller)呢,因为传统的MVC模式在Android中,把View和controller都杂糅到Activity当中,导致Activity越来越臃肿,使得难以开发和维护。而MVP(model, view, presenter)模式中,则把一些业务逻辑分离出来放到Presenter中,在MVP中的M(model)和V(view)是没有箭头连接的,也就是MVP中(View只需要做些与用户相关的操作,即绘制界面以及与用户交互),其他的业务功能逻辑都交由Presenter来完成。

6f3e43c34610747ff7ee31081da2bc70.png

在官方介绍中有Contract这个Interface,里面定义了View和Presenter接口,其实Contract在mvp中什么角色也不是,只是把view和presenter定义在一起方便管理。

现在给个简单例子:

假设我们要从网络获取数据并显示用户的个人界面;

同时我们可以更改用户数据并上传到服务器;

为了简单起见并不真正的获取网络数据,也省去了异步等操作,在实际开发中都是要考虑的。

首先来看View和Presenter的接口定义

public interface BasePresenter {

void start();

}

public interface BaseView {

void setPresenter(T presenter);

}

public interface UserInfoContract {

interface Presenter extends BasePresenter{

void loadUserInfo();

void changeAge();

}

interface View extends BaseView{

void showUserInfoView(UserInfo userInfo);

void showErrorMessage(String errMsg);

UserInfo getUserInfo();

}

}

可以看到在BaseView这个基类接口中含有setPresenter,从图上也可以看出,View和Presenter是可以相互交换数据的,所以一般都会互相持有对方的引用。我们再看看它们的实现类。

public class UserInfoActivity extends AppCompatActivity implements UserInfoContract.View{

TextView nameTxt;

TextView ageTxt;

EditText newAgeEdit;

Button change;

UserInfoContract.Presenter presenter;

UserInfo info;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_user_info);

nameTxt = (TextView)findViewById(R.id.name);

ageTxt = (TextView)findViewById(R.id.age);

newAgeEdit = (EditText)findViewById(R.id.new_age);

change = (Button)findViewById(R.id.change);

change.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

String str = newAgeEdit.getText().toString();

if(str.length() !=0 ){

int ageInt = Integer.valueOf(str);

info.setAge(ageInt);

presenter.changeAge();

}

}

});

//创建Presenter

UserInfoContract.Presenter presenter =new UserInfoPresenter(this);

}

@Override

public void showUserInfoView(UserInfo userInfo) {

//更新用户界面

info = userInfo;

nameTxt.setText(userInfo.getName());

ageTxt.setText(userInfo.getAge() + "");

}

@Override

public void showErrorMessage(String errMsg) {

//显示错误信息

Toast.makeText(this,errMsg,Toast.LENGTH_LONG).show();

}

@Override

public UserInfo getUserInfo() {

return info;

}

@Override

public void setPresenter(UserInfoContract.Presenter presenter) {

this.presenter = presenter;

}

}

public class UserInfoPresenter implements UserInfoContract.Presenter {

UserInfoContract.View view;

UserInfo info;

public UserInfo getNetworkData(){

//模拟网络io等操作,获取数据

if(info == null){

info = new UserInfo();

info.setAge(16);

info.setId(1);

info.setName("lawliex");

}

return info;

}

public UserInfoPresenter(UserInfoContract.View view) {

this.view = view;

view.setPresenter(this);

start();

}

@Override

public void loadUserInfo() {

UserInfo userInfo = getNetworkData();

//取得数据后,因为presenter持有view的引用,可以回调view的相关方法,此处假设加载数据成功,回调显示正常界面

view.showUserInfoView(userInfo);

//如果发生错误则回调

//view.showErrorMessage("error");

}

@Override

public void changeAge() {

info = view.getUserInfo();

//模拟更新数据到服务器,成功后,更新View的数据

start();

}

@Override

public void start() {

loadUserInfo();

}

}

项目源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值