mvp模式
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
上一篇: js知识梳理1:理解对象的属性特性
下一篇: js 解 岛屿的最大面积