当前位置: 移动技术网 > IT编程>移动开发>Android > mvp模式

mvp模式

2018年08月20日  | 移动技术网IT编程  | 我要评论

钟爱宝 性女传奇,周凤臣,聂海胜的资料

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





如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网