您的位置:首页 > 移动开发 > Android开发

android MVP 实践笔记

2016-06-01 15:08 465 查看
我是这样理解的

首先一个界面先看看需要哪些操作 ,已注册登录为例子

注册界面 一般有获取验证码,和注册的操作。界面上大概就是这几种,获取验证码成功,失败,注册成功失败,显示loading和隐藏而已。

那我就先写个interface -RegistView

RegistView

/**
* 注册视图
* Created by wushange on 2016/06/01.
*/
public interface RegistView {
/**
* 获取验证码成功
*/
void OnShowSuccessGetCodeView();

/**
* 获取验证码失败
*/
void OnshowFailGetCodeView();

/**
* 注册成功
*
* @param user
*/
void onShowSuccessRegistView(String user);

/**
* 注册失败
*/
void onShowFailedRegistView();

/**
* 显示loading
*/
void showLoadingView();

/**
* 隐藏loading
*/
void dissLoadingView();
}


有了接口就要实现他了,那就简单了,写个manager管理类, 这里面是真正的业务处理,所有的异步操作放在这里执行。比如登录 ,注册,获取验证码。

LoginAndRegistMananger

import com.dmcc.dmcc_crm.bean.User;

import org.xutils.common.util.LogUtil;

/**
* 业务处理层
*/
public class LoginAndRegistMananger {
/**
* 获取验证码回掉
* 需要什么参数自己添加就可以
*/
public interface OnGetCodeLisener {
void getCodeSuccess();
void getCodeFail();
}

/**
* 注册相关 回掉
* 需要什么参数自己添加就可以
*/
public interface OnRegistLisener {
void registSuccess(String user);
void registFailed();
}

/**
* 登录相关 回掉
* 需要什么参数自己添加就可以
*/
public interface OnLoginListener {
void loginSuccess(User user);
void loginFailed();
}

public void getCode(final String phone, final OnGetCodeLisener onGetCodeLisener) {

LogUtil.e("---模拟子线程耗时操作----");
new Thread() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LogUtil.e("---  模拟获取验证码成功----");
onGetCodeLisener.getCodeSuccess();
}
}.start();
}

public void regist(final String username, final String password, final String code, final OnRegistLisener onRegistLisener) {
LogUtil.e("---模拟子线程耗时操作----");
new Thread() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LogUtil.e("---  模拟注册成功----");
onRegistLisener.registSuccess("注册成功");
}
}.start();
}

public void login(final String username, final String password, final OnLoginListener loginListener) {
LogUtil.e("---模拟子线程耗时操作----");
new Thread() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LogUtil.e("---  模拟登录成功----");

if ("111".equals(username) && "111".equals(password)) {
User user = new User();
user.setUserName(username);
user.setPassword(password);
loginListener.loginSuccess(user);
} else {
loginListener.loginFailed();
}
}
}.start();
}


然后再写个presenter类 这个是activity层 获得数据的(我是这样子理解的)

LoginAndRegistPresenter实现

import com.dmcc.dmcc_crm.bean.User;
import com.dmcc.dmcc_crm.view.LoginView;
import com.dmcc.dmcc_crm.view.RegistView;

/**
* p层
*/
public class LoginAndRegistPresenter {
RegistView registView;
LoginView loginView;
LoginAndRegistMananger loginAndRegistMananger;

/**
* 登陆界面构造器
*
* @param loginView
*/
public LoginAndRegistPresenter(LoginView loginView) {
this.loginView = loginView;
this.loginAndRegistMananger = new LoginAndRegistMananger();
}

/**
* 注册界面构造器
*
* @param registView
*/
public LoginAndRegistPresenter(RegistView registView) {
this.registView = registView;
this.loginAndRegistMananger = new LoginAndRegistMananger();
}

/**
* 获取验证码
* @param phone
*/
public void getCode(String phone) {
registView.showLoadingView();
loginAndRegistMananger.getCode(phone, new LoginAndRegistMananger.OnGetCodeLisener() {
@Override
public void getCodeSuccess() {
registView.OnShowSuccessGetCodeView();
registView.dissLoadingView();
}

@Override
public void getCodeFail() {
registView.OnshowFailGetCodeView();
registView.dissLoadingView();
}
});

}

/**
* 注册
* @param name
* @param password
* @param code
*/
public void regist(String name, String password, String code) {
registView.showLoadingView();
loginAndRegistMananger.regist(name, password, code, new LoginAndRegistMananger.OnRegistLisener() {
@Override
public void registSuccess(String user) {
registView.onShowSuccessRegistView(user);
registView.dissLoadingView();
}

@Override
public void registFailed() {
registView.onShowFailedRegistView();
registView.dissLoadingView();
}
});

}

/**
* 登录
* @param name
* @param password
*/
public void login(String name, String password) {
loginView.showLoadingView();
loginAndRegistMananger.login(name, password, new LoginAndRegistMananger.OnLoginListener() {
@Override
public void loginSuccess(User user) {
loginView.onShowSuccessLoginView(user);
loginView.dissLoadingView();

}

@Override
public void loginFailed() {
loginView.onShowFailedLoginView(0);
loginView.dissLoadingView();
}
});
}
}


最后就是使用了 在登陆界面

只需要实现loginview

然后调用 LoginAndRegistPresenter 实现登陆功能

/**
* Created by wushange on 2016/06/01.
*/
public class LoginActivity extends BaseSwipeBackActivity implements LoginView {
LoginAndRegistPresenter mloginPresenter = new LoginAndRegistPresenter(this);

@ViewInject(R.id.login_btn)
Button login;
@ViewInject(R.id.go_reg_btn)
Button go_reg_btn;
@ViewInject(R.id.apptitle)
AppTitle appTitle;

@Override
public int bindLayout() {
return R.layout.activity_login_main_view;
}

@Override
public void initView(View view) {
appTitle.init(AppTitle.AppTitleStyle.BACK_TITLE);
appTitle.setTitle("登陆");
appTitle.setBackClickClisener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});

}

@Override
public void doBusiness(Context mContext) {

}

@Event(R.id.login_btn)
private void setLogin(View v) {
LogUtil.e("---setLogin----");
mloginPresenter.login("111", "111");
}

@Event(R.id.go_reg_btn)
private void setGo_reg_btn(View v) {
AppUtils.startAct(getContext(), RegistActivity.class);
}

@Override
public void onShowSuccessLoginView(User user) {
LogUtil.e("---onShowSuccessLoginView----" + user.toString());
}

@Override
public void onShowFailedLoginView(int error) {
LogUtil.e("---onShowFailedLoginView----");
}

@Override
public void showLoadingView() {
LogUtil.e("---showLoginView----");
}

@Override
public void dissLoadingView() {
LogUtil.e("---dissLoginView----");
}
}


注册界面同理

/**
* Created by wushange on 2016/06/01.
*/
public class RegistActivity extends BaseSwipeBackActivity implements RegistView {
LoginAndRegistPresenter mloginPresenter = new LoginAndRegistPresenter(this);

@ViewInject(R.id.regist_btn)
Button regist;

@ViewInject(R.id.getcode_btn)
Button getcode_btn;
@ViewInject(R.id.apptitle)
AppTitle appTitle;

@Override
public int bindLayout() {
return R.layout.activity_regist_main_view;
}

@Override
public void initView(View view) {
appTitle.init(AppTitle.AppTitleStyle.BACK_TITLE);
appTitle.setTitle("注册");
appTitle.setBackClickClisener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});

}

@Override
public void doBusiness(Context mContext) {

}

@Event(R.id.regist_btn)
private void setRegist(View v) {
mloginPresenter.regist("111", "111", "1");
}

@Event(R.id.getcode_btn)
private void setGetcode_btn(View v) {
mloginPresenter.getCode("1564594066");
}

@Override
public void onShowSuccessRegistView(String user) {
LogUtil.e("--onShowSuccessRegistView---" + user);

}

@Override
public void onShowFailedRegistView() {
LogUtil.e("--onShowFailedRegistView---");
}

@Override
public void OnShowSuccessGetCodeView() {
LogUtil.e("--OnShowSuccessGetCodeView---");
}

@Override
public void OnshowFailGetCodeView() {
LogUtil.e("--OnshowFailGetCodeView---");
}

@Override
public void showLoadingView() {
LogUtil.e("--showLoadingView---");
}

@Override
public void dissLoadingView() {
LogUtil.e("--dissLoadingView---");
}
}


以上是我自己本人今天看了下mvp的设计模式 我所领悟的。 做个笔记,还希望大家多多指教

欢迎大家加入我的qq交流群 74406192
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: