MVP andorid 使用
MVP整理:
参考:https://www.jianshu.com/p/57e5f75e9408
简介:
首先说一下大家都熟悉的mvc,mvc由三部分组成,分别是M-Model-模型、V-View-视图、C-Controller-控制器,随着功能以及业务逻辑的增加,我们希望业务逻辑model和展示层view之间的结构和关系能够更清晰,所以增加了controller,来实现两者之间的部分控制和解耦,三者之间的具体关系如下图
在MVC中:Model和View代表着业务逻辑与展示方式,Model和View往往是互相引用,改变展示方式的时候很有可能也要修改业务逻辑层,即修改Controller。
因此为了去除这种弊端,需要做解耦,我们的MVP应运而生。
同样MVP也包含三部分
Model:业务逻辑,工作职责是:加载数据。
View:视图,工作职责是:控制显示数据的方式。
Presenter:中间者,绑定Model、View。
虽然MVP的使用比较麻烦了些,但是它的有点也是很明显的,Model和View充分解耦,修改一个不会牵扯到另外一个。
另外,视图、业务逻辑也有可能会变,因此视图、业务逻辑抽取成接口,改变不同的实现类即可。 Presenter中只持有Model和VIew的引用,可以随时更换它们的实现类,从而实现对扩展是开放的。
因此MVP相对于MVC来说,规范比较明确,在系统架构上扩展性更加强。
具体的Demo:
先看下整个demo的目录结构:
下面开始分别讲解:
1. 首先作为一个app需要展示数据,那么我们先创建一个目录,专门放Model,为了更好的提高扩展,数据以及显示都是通过接口的方式来实现的,因此需要创建SendMsgModel.
public interface SendMsgModel {
void sendMsg(String json, String flag,SendMsgListener sendMsgListener);
}
其中需要一个sendMsgListener
public interface SendMsgListener {
void sendMsgSuccess();
void sendMsgFail(String msg);
}
- 然后我们需要实现这个接口
public class SendMsgModelImpl implements SendMsgModel{
@Override
public void sendMsg(String json, String flag ,final SendMsgListener sendMsgListener) {
String url = Constant.baseUrl + "AppWebService.do?appGetSms";
OkHttpUtils
.post()
.url(url)
.addParams("json",json)
.addParams("flag",flag)
.build()
.execute(new ResponseCallback() {
@Override
public void onError(Call call, Exception e, int id) {
LOG.d("url---------->", e.getMessage());
sendMsgListener.sendMsgFail(MyApplication.getInstance().getApplicationContext().getString(R.string.http_request_fail_hint));
}
@Override
public void onResponse(ResponseEntity response, int id) {
if(response.isSuccess()){
sendMsgListener.sendMsgSuccess();
}else{
sendMsgListener.sendMsgFail(response.getMsg());
}
}
});
}
}
- 接着我们需要View的接口,一个显示进度条,一个隐藏进度条,一个发送成功的方法,一个发送失败的方法。
public interface SendMsgView {
void showProgress();
void hideProgress();
void sendMsgViewSuccess();
void sendMsgViewFail(String msg);
}
- 我们的Activity是作为View的实现类,因此需要实现View的接口,并且实现里面的抽象方法
- 但是上面的activity中并没有与model层进行关联,所以需要有一个中间的控制层,presenter。
public interface SendMsgPresenter {
void doSendMsg(String json,String flag);
void onDestroy();
}
.6. 然后我们实现该接口,由于presenter充当view与model的中介,所以presenter在构造方法中会持有model以及view的引用,并实现相关view的方法,以及model的方法。
public class SendMsgPresenterImpl implements SendMsgPresenter ,SendMsgListener {
private SendMsgModel mSendMsgModel;
private SendMsgView mSendMsgView;
public SendMsgPresenterImpl(SendMsgView mSendMsgView) {
this.mSendMsgView = mSendMsgView;
mSendMsgModel = new SendMsgModelImpl();
}
@Override
public void sendMsgSuccess() {
mSendMsgView.hideProgress();
mSendMsgView.sendMsgViewSuccess();
}
@Override
public void sendMsgFail(String msg) {
mSendMsgView.hideProgress();
mSendMsgView.sendMsgViewFail(msg);
}
@Override
public void doSendMsg(String json,String flag) {
mSendMsgView.showProgress();
mSendMsgModel.sendMsg(json,flag,this);
}
@Override
public void onDestroy() {
mSendMsgView = null;
}
}
.7. 完善第四步,就是在activity中,根据presenter进行model层的操作,以及自己view层的操作
public class MainActivity extends BaseActivity implements SendMsgView{
// 发送短信的Presenter
private SendMsgPresenter mSendMsgPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册EventBus
EventBus.getDefault().register(this);
// 初始化Presenter
initPresenter();
}
/**
* 初始化Presenter
*/
private void initPresenter(){
mSendMsgPresenter = new SendMsgPresenterImpl(this);
}
/**
* 截取所需内容
*/
@SuppressLint("SetTextI18n")
private void transferValue(String type){
String json = "";
if(!json.equals("[]")){
//检查网络连接
if(isNetworkConnected(context)){
mSendMsgPresenter.doSendMsg(json,type);
}else{
isSettingDialog(context);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//解除绑定
mSendMsgPresenter.onDestroy();
}
@Override
public void showProgress() {
LoadingDialogUtils.showDialog(mLoadingDialog);
}
@Override
public void hideProgress() {
LoadingDialogUtils.closeDialog(mLoadingDialog);
}
@Override
public void sendMsgViewSuccess() {
ShowToast.showToast("导入成功",context);
}
@Override
public void sendMsgViewFail(String msg) {
ShowToast.showToast(msg,context);
}
}
源码地址:https://download.csdn.net/download/silence_sep/10562709
上一篇: Android MVP应用
下一篇: 重拾Android之路(十七)MVP