MVP模型一般要创建三个文件夹:View、Interactor(Model)、Presenter

每个部分都有其接口和实现类,就是为了方便回调

这里做一个登陆界面为例子:

接口:

InteractorInterface:
public interface LoginInteractor {
void login(String userName,String password,OnLoginFinishedListener listener);
}
PresenterInterface
public interface LoginPresenter {
void validateCredentials(String userName,String password);
void onDestroy();
}
public interface OnLoginFinishedListener {
void onUserNameError();
void onPasswordError();
void onSuccess();
}
ViewInterface
public interface LoginView {
void setUserNameError();
void setPasswordError();
void navigateToHome();
}

实现类:

InteractorImpl
public class LoginInteractorImpl implements LoginInteractor {
@Override
public void login(final String userName, final String password, final OnLoginFinishedListener listener) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Log.i("ZhiXueHui", "LoginInteractorImpl-login");
boolean error = false;
if(TextUtils.isEmpty(userName)){
listener.onUserNameError();
error = true;
}
if(TextUtils.isEmpty(password)){
listener.onPasswordError();
error = true;
}
if(!error){
listener.onSuccess();
}
}
},2000);
}
}
PresenterImpl
public class LoginPresenterImpl implements LoginPresenter,OnLoginFinishedListener {
private LoginView loginView;
private LoginInteractor loginInteractor; public LoginPresenterImpl(LoginView loginView){
this.loginView = loginView;
this.loginInteractor = new LoginInteractorImpl();
} @Override
public void validateCredentials(String userName, String password) {
Log.i("ZhiXueHui", "LoginPresenterImpl-validateCredentials");
loginInteractor.login(userName,password,this);
} @Override
public void onDestroy() {
Log.i("ZhiXueHui", "LoginPresenterImpl-onDestroy");
loginView = null;
} @Override
public void onUserNameError() {
Log.i("ZhiXueHui", "LoginPresenterImpl-onUserNameError");
if(loginView!=null){
loginView.setUserNameError();
}
} @Override
public void onPasswordError() {
Log.i("ZhiXueHui", "LoginPresenterImpl-onPasswordError");
if(loginView!=null){
loginView.setPasswordError();
}
} @Override
public void onSuccess() {
Log.i("ZhiXueHui", "LoginPresenterImpl-onSuccess");
if(loginView!=null){
loginView.navigateToHome();
}
}
}
ViewActivity
public class LoginActivity extends Activity implements LoginView, View.OnClickListener {

    private EditText userName;
private EditText password;
private Button button;
private LoginPresenter presenter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Log.i("ZhiXueHui", "LoginActivity-onCreate");
userName = (EditText) findViewById(R.id.userName);
password = (EditText) findViewById(R.id.password);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(this); presenter = new LoginPresenterImpl(this);
} @Override
public void setUserNameError() {
Log.i("ZhiXueHui", "LoginActivity-setUserNameError");
userName.setError(getString(R.string.username_error));
} @Override
public void setPasswordError() {
Log.i("ZhiXueHui", "LoginActivity-setPasswordError");
password.setError(getString(R.string.password_error));
} @Override
public void navigateToHome() {
Log.i("ZhiXueHui", "LoginActivity-navigateToHome");
startActivity(new Intent(this, MainActivity.class));
finish();
} @Override
public void onClick(View v) {
Log.i("ZhiXueHui", "LoginActivity-onClick");
presenter.validateCredentials(userName.getText().toString(),password.getText().toString());
}
}

流程图:

流程解释:

第一步:View的实现类调用Presenter的接口

第二步:Presenter的实现类调用Model的接口

第三步:Model的实现类回调Presenter的接口

第四步:Presenter的实现类回调View的接口

一个循环下来,正好是View->Presenter->Model->Presenter->View。

其中要注意的是,Presenter作为中转,分别对接View的实现类和Model的实现类,所以必须要建立两个接口

最新文章

  1. pythonchallenge 解谜 Level 2
  2. svn 更新命令(冲突时使用theirs)
  3. PHP中JSON的跨域调用
  4. 转帖不会乱码的,powershell网络蜘蛛
  5. SparkContext源码阅读
  6. 8.8 CSS知识点1
  7. Bootstrap页面布局8 - BS常用标签与样式
  8. C# 获取汉字的拼音首字母
  9. 创建MySQL从库
  10. [改善Java代码]用枚举实现工厂方法模式更简洁
  11. 需要保存数据zabbix,不需要保存数据nagios
  12. Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException
  13. C# IIS7.0+ Web.Config 配置Session过期时间
  14. Extjs4+PHP MVC模式一(入门)
  15. 百度地图Marker优化方案
  16. 【技能大赛笔记01】Zigbee点对点按键控制程序开发
  17. 让Virtualbox复制出的虚拟机联网
  18. CF375D Tree and Queries(dsu on tree)
  19. 2017-2018-2 《网络对抗技术》 20155310 第二周 Exp1 PC平台逆向破解(5)M
  20. [jquery-delegate] iphone_4s _iphone _5c_中不兼容jQuery delegate 事件(does not wok)

热门文章

  1. excel sum求和遇到的问题及解决
  2. psutil-3.4.2才是我的老系统(Windows XP)的菜
  3. [NOIP2015提高&洛谷P2678]跳石头 题解(二分答案)
  4. POJ 1350 Cabric Number Problem (模拟)
  5. JavaScript基本运算
  6. react页面间传递参数
  7. 20165227 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
  8. 【codeforces】【比赛题解】#864 CF Round #436 (Div.2)
  9. KL散度(Kullback–Leibler divergence)
  10. pymongo的几个操作