安卓MVP框架
一、理解MVP
效果图:

项目结构:

实现
一、Model层
首先定义一个实体类User
package app.qcu.pmit.cn.mvpdemo.model;
/**
* Created by Administrator on 2018/5/24 0024.
*/
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
其次就是业务类,抽取了一个接口 IUserBiz,登录界面连接服务器有一个登录方法 Login() ,耗时操作需要开辟子线程,
package app.qcu.pmit.cn.mvpdemo.model;
/**
* Created by Administrator on 2018/5/24 0024.
*/
public class UserBiz implements IUserBiz {
@Override
public void login(final String name, final String pwd, final OnLoginListener listener) {
new Thread() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if ("yl".equals(name) && "123456".equals(pwd)) {
User user = new User();
user.setUsername(name);
user.setPassword(pwd);
listener.loginSuccess(user);
} else {
listener.loginFaild();
}
}
}.start();
}
}
package app.qcu.pmit.cn.mvpdemo.model;
/**
* Created by Administrator on 2018/5/24 0024.
*/
public interface IUserBiz {
void login(String name, String pwd, OnLoginListener listener);
}
再用一个回调接口来通知登录的状态,成功或者失败
package app.qcu.pmit.cn.mvpdemo.model;
/**
* Created by Administrator on 2018/5/24 0024.
*/
public interface OnLoginListener {
void loginSuccess(User user);
void loginFaild();
}
二、View层
UI的逻辑,抽取一个接口由Activity实现
package demo.example.com.mvp3.view;
/**
* Created by Administrator on 2018/5/9 0009.
*/
public interface IUserLoginView {
String getName();
String getPwd();
void showLoading();
void hideLoading();
void toMainActivity();
void showFaildError();
void clearName();
void clearPwd();
}
package demo.example.com.mvp3.view;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;
import demo.example.com.mvp3.MainActivity;
import demo.example.com.mvp3.R;
import demo.example.com.mvp3.presenter.UserLoginPresenter;
/**
* Created by Administrator on 2018/5/9 0009.
*/
public class UserLoginActivity extends AppCompatActivity implements IUserLoginView {
private EditText etName, etPwd;
private Button btnLogin, btnClear;
private ProgressBar pbLogin;
private UserLoginPresenter userLoginPresenter = new UserLoginPresenter(this);
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initView();
}
private void initView() {
etName = findViewById(R.id.user_name);
etPwd = findViewById(R.id.user_pwd);
btnLogin = findViewById(R.id.btn_login);
btnClear = findViewById(R.id.btn_clear);
pbLogin = findViewById(R.id.pb_login);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
userLoginPresenter.Login();
}
});
btnClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
userLoginPresenter.clear();
}
});
}
@Override
public String getName() {
return etName.getText().toString();
}
@Override
public String getPwd() {
return etPwd.getText().toString();
}
@Override
public void showLoading() {
pbLogin.setVisibility(View.VISIBLE);
}
@Override
public void hideLoading() {
pbLogin.setVisibility(View.GONE);
}
@Override
public void toMainActivity() {
startActivity(new Intent(this, MainActivity.class));
}
@Override
public void showFaildError() {
Toast.makeText(this, "名字还是密码写错啦!", Toast.LENGTH_SHORT).show();
}
@Override
public void clearName() {
etName.setText("");
}
@Override
public void clearPwd() {
etPwd.setText("");
}
}
三、Presenter层
界面整体的用户交互的功能有两个,“登录”和“清除”,所以Presenter中有两个方法,即 login() 和 clear(),使用view和model中的方法实现
package app.qcu.pmit.cn.mvpdemo.presenter;
import android.os.Handler;
import app.qcu.pmit.cn.mvpdemo.model.IUserBiz;
import app.qcu.pmit.cn.mvpdemo.model.OnLoginListener;
import app.qcu.pmit.cn.mvpdemo.model.User;
import app.qcu.pmit.cn.mvpdemo.model.UserBiz;
import app.qcu.pmit.cn.mvpdemo.view.IUserLoginView;
/**
* Created by Administrator on 2018/5/24 0024.
*/
public class UserLoginPresenter {
private IUserBiz userBiz;
private IUserLoginView userLoginView;
private Handler mHandler = new Handler();
public UserLoginPresenter(IUserLoginView userLoginView) {
this.userLoginView = userLoginView;
this.userBiz = new UserBiz();
}
public void Login() {
userLoginView.showLoading();
userBiz.login(userLoginView.getName(), userLoginView.getPwd(), new OnLoginListener() {
@Override
public void loginSuccess(User user) {
//需要在UI线程执行
mHandler.post(new Runnable() {
@Override
public void run() {
userLoginView.toMainActivity();
userLoginView.hideLoading();
}
});
}
@Override
public void loginFaild() {
//需要在UI线程执行
mHandler.post(new Runnable() {
@Override
public void run() {
userLoginView.showFaildError();
userLoginView.hideLoading();
}
});
}
});
}
public void clear() {
userLoginView.clearName();
userLoginView.clearPwd();
}
}
二、实际开发MVP(官方模式)
安卓MVP框架的更多相关文章
- 【腾讯Bugly干货分享】一步一步实现Android的MVP框架
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5799d7844bef22a823b3ad44 内容大纲: Android 开发 ...
- mvp框架
本文在于巩固基础 mvp框架的概念: MVP是MVC模式的另一个变种,MVP即可以应用到WEB项目中, 也可以应用到Winform项目中,它的方便的测试机制为大型复杂的企业级应用带来了福音,MVP模式 ...
- Android Studio开发快速创建MVP框架插件AndroidMVP
转载:https://www.jianshu.com/p/60cd98bbc358 Android开发中,我们为了代码的解耦以及后期的维护方便,都会采用一些开发框架,常用的有MVC.MVP.MVVM. ...
- 如何实现自己的Android MVP框架?
相信熟悉android开发的童鞋对MVP框架应该都不陌生吧,网上很多关于android中实现MVP的文章,大家可以直接搜索学习.这些文章中,MVP的实现思路基本都是把Activity.Fragment ...
- JavaScript 的 MVP 框架 Riot.js
Riot.js 详细介绍 Riot.js是一个客户端模型-视图-呈现(MVP)框架并且它非常轻量级甚至小于1kb.尽管他的大小令人难以置信,所有它能构建的有如下:一个模板引擎,路由,甚至是库和一个严格 ...
- 玩转OneNET物联网平台之MQTT服务⑤ —— OneNet智能灯+MVP框架
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- 移动架构之MVP框架
MVP是在开发中常用的框架,要了解其原理,先要从了解MVC开始,这里就对MVP框架做一个简单的介绍 MVC MVC为Model,View与Controllor的缩写 Model:业务逻辑和实体模型 V ...
- android课程表控件、悬浮窗、Todo应用、MVP框架、Kotlin完整项目源码
Android精选源码 Android游戏2048 MVP Kotlin项目(RxJava+Rerotfit+OkHttp+Glide) Android基于自定义Span的富文本编辑器 android ...
- Android MVP框架模式
结合前一篇MVC框架模式 为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Model只关系数据的处理,基于MVC概念的MVP(Mode ...
随机推荐
- asp.net mvc 简单实现一个账号只能在一个地方登录
原理: 假设用户在机器A登陆后, 这时用户再次在机器B登陆,会以当前会话的SessionID作为键,用户id作为值,插入dictionary集合中,集合再保存在application(保存在服务器 ...
- ajax中的同步与异步修改数据的问题
这次项目中因为前端有事儿,项目紧急加个新需求,于是自己硬着头皮上去看了下前端的逻辑后便开始动手了,但是为了简单起见就直接自己写了个ajax调服务来获取数据,然后修改前端定义的全局数据 //ajax来请 ...
- AngularJs实现全选功能
html代码 <!-- 数据表格 --> <div class="table-box"> <!--工具栏--> <div class=&q ...
- javaScript核心基础
JavaScript 是属于网络的脚本语言! JavaScript 作用:被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies(js也可创建cookie,在浏览器里面创建),以及更多 ...
- linux----------linux下配置内网ip
1./etc/sysconfig/network-scripts/ifcfg-eth1 创建这个文件里面的内容如下 TYPE="Ethernet" BOOTPROTO=&quo ...
- centos----------centos下如何安装phpstorm
1.首先打开centos下的谷歌浏览器,找到phpstorm官网下载linux版本.PhpStorm-2016.3.2.tar.gz 2.然后gunzip PhpStorm-2016.3.2.tar. ...
- python将对象名的字符串类型,转化为相应对象的操作方法
在实际使用Python的过程中,遇到了一个问题,就是定义一个数组,数组内容为对应类名字的字符串. 此时在调用对应的类,生成实例时,需要将字符串转化为相应的类,之后再进行实例化. # coding : ...
- kendo treeview checkbox初始化选中问题,没解决,暂时记录下
想做带有checkbox的tree,由于项目一直用kendo ui for mvc,感觉 牛逼的kendo肯定有tree.结果碰到了选中的问题. 无法根据后台传来的IsChecked字段来设置 tr ...
- flask 定义数据库关系(一对多)
定义关系 在关系型数据库中,我们可以通过关系让不同表之间的字段建立联系.一般来说,定义关系需要两步,分别是创建外键和定义关系属性.在更复杂的多对多关系中,我们还需要定义关联表来管理关系.下面我们学习用 ...
- <转>jmeter(十九)HTTP属性管理器
本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...