Android开发学习--MVP模式入门

1、模型与视图完全分离,我们可以修改视图而不影响模型
2、可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部
3、我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
4、如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)
下面示例一个小案例:
项目架构:

首先bean层:
User.java
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity implements IUserLoginView{
private EditText musername;
private EditText mpasssword;
private Button mlogin;
private Button mclear;
private ProgressBar mpb;
private UserLoginPresenter mUserLoginPresenter = new UserLoginPresenter(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
musername = (EditText) findViewById(R.id.username);
mpasssword = (EditText) findViewById(R.id.password);
mlogin = (Button)findViewById(R.id.login);
mclear = (Button)findViewById(R.id.clear);
mpb = (ProgressBar) findViewById(R.id.pb);
mlogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mUserLoginPresenter.login();
}
});
mclear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mUserLoginPresenter.clear();
}
});
}
@Override
public String getUsername() {
return musername.getText().toString();
}
@Override
public String getPassword() {
return mpasssword.getText().toString();
}
@Override
public void clearUsername() {
musername.setText("");
}
@Override
public void clearPassword() {
mpasssword.setText("");
}
@Override
public void showLoading() {
mpb.setVisibility(View.VISIBLE);
}
@Override
public void hideLoading() {
mpb.setVisibility(View.GONE);
}
@Override
public void toMainActivity(User user) {
Toast.makeText(this, user.getUsername() +
" login success , to MainActivity", Toast.LENGTH_SHORT).show();
}
@Override
public void showFailError() {
Toast.makeText(this,
"login failed", Toast.LENGTH_SHORT).show();
}
}
IUserLoginView.java
public interface IUserLoginView {
//操作的目的
String getUsername();
String getPassword();
void clearUsername();
void clearPassword();
//友好的交互
void showLoading();
void hideLoading();
//操作的结果,对应的反馈
void toMainActivity(User user);
void showFailError();
}
UserLoginPresenter.java
//Model和View的桥梁 login clear
public class UserLoginPresenter {
private IUserLoginView userLoginView;
private IUserBiz userBiz;
private Handler mHandler = new Handler(); public UserLoginPresenter(IUserLoginView userLoginView){
this.userLoginView = userLoginView;
this.userBiz = new UserBiz();
} public void login()
{
userLoginView.showLoading();
userBiz.login(userLoginView.getUsername(), userLoginView.getPassword(),new OnLoginListener()
{
@Override
public void loginsuccess(final User user)
{
//需要在UI线程执行
mHandler.post(new Runnable()
{
@Override
public void run()
{
userLoginView.toMainActivity(user);
userLoginView.hideLoading();
}
}); } @Override
public void loginfail()
{
//需要在UI线程执行
mHandler.post(new Runnable()
{
@Override
public void run()
{
userLoginView.showFailError();
userLoginView.hideLoading();
}
}); }
});
} public void clear()
{
userLoginView.clearUsername();
userLoginView.clearPassword();
}
}
IUserBiz.java
public interface IUserBiz {
public void login(String username,String password,OnLoginListener loginListener);
}
UserBiz.java
public class UserBiz implements IUserBiz {
@Override
public void login(final String username,final String password, final OnLoginListener loginListener) {
new Thread(){
@Override
public void run() {
try
{
Thread.sleep(2000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
if("name".equals(username)&&"pwd".equals(password)){
User user = new User();
user.setUsername(username);
user.setPassword(password);
loginListener.loginsuccess(user);
}else{
loginListener.loginfail();
}
}
}.start();
}
}
OnLoginListener.java
public interface OnLoginListener {
void loginsuccess(User user);
void loginfail();
}


Android开发学习--MVP模式入门的更多相关文章
- Android开发学习--ViewPager使用入门
ViewPager已经有了滑动的功能 activity_main.xml <?xml version="1.0" encoding="utf-8"?> ...
- Android开发学习总结(一)——搭建最新版本的Android开发环境
Android开发学习总结(一)——搭建最新版本的Android开发环境(转) 最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是 ...
- Android开发学习之路-RecyclerView滑动删除和拖动排序
Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...
- Android菜鸟的成长笔记(1)——Android开发环境搭建从入门到精通
原文:Android菜鸟的成长笔记(1)--Android开发环境搭建从入门到精通 今天在博客中看到好多Android的初学者对Android的开发环境的搭建不熟悉而导致不能进行学习,所以我决定自己写 ...
- Android开发学习之路--Activity之初体验
环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...
- Android开发学习之路--MAC下Android Studio开发环境搭建
自从毕业开始到现在还没有系统地学习android应用的开发,之前一直都是做些底层的驱动,以及linux上的c开发.虽然写过几个简单的app,也对android4.0.3的源代码做过部分的分析,也算入门 ...
- Android开发学习路线的七个阶段和步骤
Android开发学习路线的七个阶段和步骤 Android学习参考路线 第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和St ...
- Android开发学习路线图
Android开发学习方法: Android是一个比较庞大的体系,从底层的Linux内核到上层的应用层,各部分的内容跨度也比较大.因此,一个好的学习方法对我们学习Android开发很重要. 在此建议, ...
- android开发学习笔记000
使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...
随机推荐
- glTF格式初步了解
glTF格式初步了解 近期看到Qt 3D的进展.偶然了解到了一种新的格式:glTF格式.这样的格式据说比现有的3D格式更加符合OpenGL应用的须要.这引起了我的好奇.于是我在Qt 3D的外部链接中找 ...
- STL 源代码剖析 算法 stl_algo.h -- nth_element
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie nth_element ---------------------------------- ...
- Hadoop DistributedCache使用案例
背景 公司数据处理具有两个计算框架,单机框架和MR框架.眼下我已经抽象出一套API interface, 供业务计算开发者使用. 并分别在两个计算框架下实现了API的运行调度.应用开发者有时间须要通过 ...
- windows下使用mingw和msys编译GOTOBLAS和OpenBLAS
在windows下利用msys编译openBLAS若遇到错误提示: gcc: CreateProcess : No such file or directory 问题原因参考:http://www.c ...
- Servlet访问Javabean并传结果给jsp
1.先建立包名: 2.建立实体类 参考二维表,考虑各个字段名字.类型 在entity包里面建立一个类,代码如下: public class House { private String id; pri ...
- 搭建gitserver
1.下载gitosis代码出错 git clone git://eagain.net/gitosis.git Initialized empty Git repository in /tmp/gito ...
- LiveWriter插入高亮代码插件介绍 基于SyntaxHighighter
Codeint main() { int i; printf("%d",i); } 插件介绍 辛苦了两人小时写日志不小心浏览器崩溃了,发誓以后一定记得用Word先写好. 将Word ...
- 一步一步学Silverlight 2系列(3):界面布局
述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- 并不对劲的bzoj4198:loj2132:uoj130:p2168:[NOI2015]荷马史诗
题目大意 有\(n\)(\(n\leq10^5\))种单词,其中第\(i\)种单词在文章中的出现次数为\(w_i\) 要将每个单词替换成一个字符集为\(k\)(\(k\leq9\))的字符串,使对于任 ...
- QQ拼音输入法的人机交互
一.从用户的角度出发: 1.界面简洁,简单 2.在我们有输入要求的时候,上述界面才会出现,当我们不用输入时,他就自动隐藏了 3.具有个性,每个人都能有自己独特的汉字库,也能够显示自己每天输入汉字的个数 ...