欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

mvp模式

程序员文章站 2022-03-18 15:42:27
MVP 模式将Activity 中的业务逻辑全部分离出来,让Activity 只做 UI 逻辑的处理,所有跟Android API无关的业务逻辑由 Presenter 层来完成。 Model 层中包含着具体的数据请求,数据源。 Activity 和Fragment 视为View层,负责处理 UI。 ......

mvp 模式将activity 中的业务逻辑全部分离出来,让activity 只做 ui 逻辑的处理,所有跟android api无关的业务逻辑由 presenter 层来完成。

model 层中包含着具体的数据请求,数据源。

activity 和fragment 视为view层,负责处理 ui。

presenter 为业务处理层,既能调用ui逻辑,又能请求数据。

 

首先是model层,model层用来获得数据比如说http请求得到的数据,首先定义model层的接口,在basemodel里添加了两个接口。

public interface  basemodel {
//这里写http请求的接口
void login(string username, string password, onfinishedlistener listener);

void exit( onfinishedlistener listener);
}

在basemodelimpl来实现接口里的方法,用来获得数据这里我模拟了耗时操作来获取数据并回调接口onfinishlistener

public class basemodelimpl implements basemodel {
//这里写http请求
@override
public void login(final string username,final string password,final onfinishedlistener listener) {
new handler().postdelayed(new runnable() {
@override public void run() {
boolean error = false;
if (textutils.isempty(username)){
listener.onerror("用户名不存在");//model层里面回调listener
error = true;
return;
}
if (textutils.isempty(password)){
listener.onpassworderror();
error = true;
return;
}
if (!error){
// 返回方法名和http请求的结果
listener.onsuccess("login","{}");
}
}
}, 2000);
}
@override
public void exit(final onfinishedlistener listener) {
new handler().postdelayed(new runnable() {
@override public void run() {
// 返回方法名和http请求的结果
listener.onsuccess("exit","{}");
}
}, 2000);
}

接口onfinishlistener是获得数据完成时根据返回结果进行不同的处理

public interface onfinishedlistener {
//通用错误提示
void onerror(string error);

//需要特殊处理的错误提示
void onusernameerror();

void onpassworderror();
/**
*
* @param way 方法名
* @param result 返回结果
*/
void onsuccess(string way,string result);
}

baseview是改变ui层的接口,在activity或者fragment调用改变ui,baseview的实现在activity或者fragment实现

 

public interface baseview {

void showprogress();

void hideprogress();

void setusernameerror();

void setpassworderror();

void seterror(string error);

void success(string way, string result);

}

basepresentesenter的作用连接model 层和view 

public interface basepresenter {

void login(string username, string password);

void exit();

void ondestroy();
}

下面是实现 basepresentesenter的方法

public class basepresenterimpl implements basepresenter, onfinishedlistener {
private baseview baseview;
private basemodel basemodel;


public basepresenterimpl(baseview baseview){
this.baseview = baseview;
this.basemodel = new basemodelimpl();
}

@override
public void login(string username, string password) {
if (baseview != null) {
baseview.showprogress();
}
basemodel.login(username, password, this);
}

@override
public void exit() {
if (baseview != null) {
baseview.showprogress();
}
basemodel.exit(this);
}

@override
public void ondestroy() {
baseview = null;
}

@override
public void onerror(string error) {
if (baseview != null) {
baseview.seterror(error);
baseview.hideprogress();
}
}

@override
public void onusernameerror() {
if (baseview != null) {
baseview.setusernameerror();
baseview.hideprogress();
}
}

@override
public void onpassworderror() {
if (baseview != null) {
baseview.setpassworderror();
baseview.hideprogress();
}
}

@override
public void onsuccess(string way, string result) {
if (baseview != null) {
baseview.success(way,result);
baseview.hideprogress();
}
}
}

ui层实现baseview的接口下面是实例

public class mainactivity extends appcompatactivity implements baseview,view.onclicklistener {


private progressbar progress;
private basepresenter presenter;
private button button;
private edittext username;
private edittext password;
private button exit;

private customdialog progressdialog;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);

progressdialog = new customdialog(this, r.style.customdialog);
progress = (progressbar)findviewbyid(r.id.progress);
presenter = new basepresenterimpl(this);
username = (edittext) findviewbyid(r.id.username);
password = (edittext) findviewbyid(r.id.password);
button = (button)findviewbyid(r.id.button);
button.setonclicklistener(this);
exit = (button)findviewbyid(r.id.exit);
exit.setonclicklistener(this);
}


@override
public void showprogress() {
progressdialog.show();
}

@override
public void hideprogress() {
progressdialog.cancel();
}

@override
public void setusernameerror() {
username.seterror(getstring(r.string.username_error));
}

@override
public void setpassworderror() {
password.seterror(getstring(r.string.password_error));
}

@override
public void seterror(string error) {
toast.maketext(this,error,toast.length_short).show();
}

@override
public void success(string way, string result) {
toast.maketext(this,way,toast.length_short).show();
//根据调用的接口,更新成功的ui
}

@override
public void onclick(view v) {
switch (v.getid()){
case r.id.button:
presenter.login(username.gettext().tostring(), password.gettext().tostring());
break;
case r.id.exit:
presenter.exit();
break;
}
}

@override
protected void ondestroy() {
presenter.ondestroy();
super.ondestroy();
}
}

 

在baseview定义不同的错误,在activity中处理他们来改变ui,比如说用户名错误我们就调用setusernameerror的方法来提示用户用户名错误,如果调用成功时会回调success方法,第一个参数是调用方法的名称,用来区分各个接口调用成功之后的不同处理,第二个参数result是返回的数据,用来处理或者填充列表。

 

github的网址:https://github.com/tempest1/androidmvp