安卓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 ...
随机推荐
- Java如何获取图片验证码保存
举例网站:https://my.1hai.cn/Login/?url=http://www.1hai.cn/ 一.场景:出于安全性考虑,越来越多的Web平台登录都会增加图形验证码(图片),或者短信验证 ...
- php 命令行参数
getopt (PHP 4 >= 4.3.0, PHP 5, PHP 7) getopt — 从命令行参数列表中获取选项 说明 array getopt ( string $options [, ...
- [js]es6语法: 字符串和数组的方法
s的方法 根据index取value: 取首尾项,arr[0], arr[arr.length-1] 根据value取index(判断是否包含子字符串): s.indexOf 栗子: 'maotai' ...
- [py]一致性hash原理
1,可变,不可变 python中值得是引用地址是否变化. 2.可hash 生命周期里不可变得值都可hash 3.python中内置数据结构特点 有序不可变 有序可变 无序可变 无序不可变 5.一致性h ...
- cocos creator 动态创建精灵
var node = new cc.Node();var sprite = node.addComponent(cc.Sprite);sprite.spriteFrame = new cc.Sprit ...
- 从Joda-Time反观Java语言利弊
基本上每个企业应用系统都涉及到时间处理.我们知道,以前用java原生的Date+Calendar非常的不方便.后来Joda-Time诞生,这个专门处理日期/时间的库提供了DateTime类型,用它可以 ...
- asp.net 导出excel--NPOI
1.使用OLEDB导出Excel ,这种方式有点慢,慎用 /// <summary> /// 使用OLEDB导出Excel /// </summary> /// <par ...
- ANNOTATION 注解
注解(Annotation)很重要,未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解的,现在的Struts2有一部分也是 ...
- GO语言常量和变量
标识符与关键字 标识符 人为定义有特殊意义的词,Go语言中标识符由字母数字和_(下划线)组成,并且只能以字母和_开头. 关键字 关键字是指编程语言中预先定义好的具有特殊含义的标识符. GO语言中有25 ...
- 用javaScript对页面元素进行显示和隐藏
将显示元素进行隐藏 用document.getElementById("ID名").hidden=ture;根据页面元素ID名获得页面元素值,进而将其属性设置成隐藏. 将隐藏元素进 ...