Android MVP开发框架
MVP
MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller。
MVP框架图 (图片来源于网络)
案例
案例代码
CallBack 数据处理返回接口
/**
* 数据返回接口
*/
public interface CallBack {
void onSuccess(Account account);
void onFailed();
}
Account 实体类
public class Account {
private String name;
private int level;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
}
MvpModel 数据处理层
public class MvpModel {
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();
}
}
}
MvpPresenter Presenter 层
public class MvpPresenter {
MvpView mvpView;
MvpModel mvpModel;
public MvpPresenter(MvpView mvpView) {
this.mvpView = mvpView;
mvpModel=new MvpModel();
}
public void getData(){
mvpModel.setAccountData(mvpView.getDataString(), new CallBack() {
@Override
public void onSuccess(Account account) {
mvpView.showSuccessPage(account);
}
@Override
public void onFailed() {
mvpView.showFailedPage();
}
});
}
}
MvpView 页面数据接口
public interface MvpView {
String getDataString();
void showSuccessPage(Account account);
void showFailedPage();
}
MainActivity
/**
* 作者:Rain
* 联系vx:rain_20181318 (备注:轻语积累)
* 公众号:轻语积累
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener, MvpView {
EditText et_text;
Button btn;
TextView content;
MvpPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
presenter=new MvpPresenter(this);
}
private void initView() {
et_text=findViewById(R.id.et_text);
btn=findViewById(R.id.btn);
content=findViewById(R.id.content);
btn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn:
presenter.getData();
break;
}
}
@Override
public String getDataString() {
return et_text.getText().toString();
}
@Override
public void showSuccessPage(Account account) {
content.setText("用户账户:"+account.getName()+"|"+"等级:"+account.getLevel());
}
@Override
public void showFailedPage() {
content.setText("页面获取失败");
}
}
activity_main.xml 页面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity">
<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="获取内容"/>
<TextView
android:id="@+id/content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
MVP 与MVC 的差别
1.Model与View不再直接进行通信,而是通过中间层presenter来实现。
2.Activity的功能被简化,不再充当控制器,主要负责View层面的功能
MVP优缺点
优点
解决了MVC中Controller 与View 过度耦合的缺点,职责划分明显,更加易于维护
缺点
接口数量变多,项目复杂度升高,随着项目复杂度的提升,Presenter层将越来越臃肿。
使用MVP建议
1.接口规范化(封装父类接口以减少接口的使用量)
2.使用第三方插件自动生成MVP代码
3.对于一些简单的界面可以选择不使用MVP框架
4.根据项目复杂程度,部分模块可以选择不使用接口
代码获取
关注微信公众号: 轻语积累
回复关键字: 源码