MVP架构实例讲解-登录界面
MVP优缺点就不介绍了,主要说下应用,今天已程序登录的界面讲解如何用MVP架构,写的不好的地方欢迎指正
在介绍之前,先看下demo的目录结构
- 定义网络相关接口
网络请求都是共通的,所以可以把网络部分单独摘出来。
首先定义网络请求状态接口。所有的网络请求都包括开始,成功,不成功。所以网络请求状态接口如下所示
public interface RequestStatus<T> {void onStart();void onSuccess(T t);void onError();}
使用泛型的原因是返回结果类型不确定。
其次是定义网络请求的方法接口
public interface NetTask<T> {/**** @param t 请求参数类型不确定* @param requestStatus 网络请求状态回调*/void exec(T t,RequestStatus requestStatus);
}
exec()方法里面传入了RequestStatus接口,是为了当网络请求有结果后回调给LoginPreserter用的。
- 定义LoginActivity 和LoginPresenter需要实现的接口。
咱们分析下,登录的时候有那些状态。涉及网络请求,为了友好的交互,肯定有显示dialog和隐藏dialog,还有就是登录验证成功和失败。
1.定义LoginActivity需要实现的接口LoginViewInterface
2.定义LoginPresenter需要实现的接口LoginPresenterInterface,这个接口用于LoginActivity和LoginPresenter的交互。
public class LoginBaseInterface {public interface LoginPresenterInterface<T>{void requestToLogin(T t);}public interface LoginViewInterface<T>{void showRequestNetDialog();//展示请求网络的dialogvoid cancelRequestNetDialog();//finish掉dialogvoid LoginSuccess(T t);//登录成功void LoginUnSuccess();//登录不成功}}
如代码所示,我将这两个接口写到一个LoginBaseInterface类中了,方便管理。
- Model层处理
因为将的是MVP,所以先说model层吧,在说这个之前先建一个实体类LoginBean,用于存储用户名和密码,因为在网络请求的时候需要用到这两个参数。
model层主要用于请求网络获取数据。所以实现之前定义的网络请求的接口NetTask
请求网络的逻辑都在这里实现。
public class LoginModel implements NetTask<LoginBean> {@Overridepublic void exec(LoginBean loginBean, RequestStatus requestStatus) {String name = loginBean.getUserName();String pwd = loginBean.getUserPwd();if (name == null && TextUtils.isEmpty(name)) {requestStatus.onError();return;}if (pwd == null && TextUtils.isEmpty(pwd)) {requestStatus.onError();return;}//这里处理和网络交互的逻辑requestStatus.onStart();//模拟请求网络if (!name.equals("18888888888")) {requestStatus.onError();return;} else {if (!pwd.equals("123456")) {requestStatus.onError();return;} else {requestStatus.onSuccess("恭喜你登录成功");}}}}
- View层处理(LoginActivity)
1.实现LoginBaseInterface中的LoginViewInterface并重载里面的方法。
2.得到网络请求的对象,将它和自己传给LoginPresenter以得到LoginPresenter对象。
3.点击登录按钮的时候。调用LoginPresenter里面的方法。
LoginActivity的所有代码
package com.mvptest.mvp_demo.login;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;import com.mvptest.mvp_demo.R;public class LoginActivity extends AppCompatActivity implements LoginBaseInterface.LoginViewInterface, View.OnClickListener {private ProgressBar mLoginPb;/*** 手机号*/private EditText mUserMobileEt;/*** 密码*/private EditText mUserPwdEt;/*** 登 录*/private TextView mLoginConfirmTv;private LoginPresenter loginPresenter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);initView();LoginModel loginModel = new LoginModel();loginPresenter = new LoginPresenter(loginModel,this);}@Overridepublic void showRequestNetDialog() {if (!mLoginPb.isShown()) {mLoginPb.setVisibility(View.VISIBLE); }}@Overridepublic void cancelRequestNetDialog() {if (mLoginPb.isShown()) {mLoginPb.setVisibility(View.INVISIBLE);}}@Overridepublic void LoginSuccess(Object o) {if (mLoginPb.isShown()) {mLoginPb.setVisibility(View.INVISIBLE);}Toast.makeText(getApplicationContext(), (String)o, Toast.LENGTH_LONG).show();}@Overridepublic void LoginUnSuccess() {if (mLoginPb.isShown()) {mLoginPb.setVisibility(View.INVISIBLE);}Toast.makeText(getApplicationContext(), "登录失败", Toast.LENGTH_LONG).show();}private void initView() {mLoginPb = (ProgressBar) findViewById(R.id.login_pb);mUserMobileEt = (EditText) findViewById(R.id.user_mobile_et);mUserPwdEt = (EditText) findViewById(R.id.user_pwd_et);mLoginConfirmTv = (TextView) findViewById(R.id.login_confirm_tv);mLoginConfirmTv.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {default:break;case R.id.login_confirm_tv:loginPresenter.requestToLogin(new LoginBean(mUserMobileEt.getText().toString().trim(),mUserPwdEt.getText().toString().trim()));break;}}
}
- Presenter层处理。
1.实现LoginBaseInterface.LoginPresenterInterface接口和网络请求状态接口RequestStatus
2.创建构造方法(参数含有网络请求对象和LoginBaseInterface.LoginViewInterface接口)
3.在请求网络的地方调用网络请求对象中的方法
4.将网络请求结果回调给view
package com.mvptest.mvp_demo.login;import com.mvptest.mvp_demo.netWork.NetTask;
import com.mvptest.mvp_demo.netWork.RequestStatus;/*** Author:wang_sir* Time:2018/5/7 20:48* Description:This is LoginPresenter* LoginPresenter 实现约定接口中的presenter接口和请求网络状态的接口*/
public class LoginPresenter implements LoginBaseInterface.LoginPresenterInterface<LoginBean>,RequestStatus<String> {private NetTask<LoginBean> netTask;private LoginBaseInterface.LoginViewInterface viewInterface;public LoginPresenter(NetTask<LoginBean> netTask, LoginBaseInterface.LoginViewInterface viewInterface) {this.netTask = netTask;this.viewInterface = viewInterface;}@Overridepublic void requestToLogin(LoginBean loginBean) {netTask.exec(loginBean,this);}@Overridepublic void onStart() {viewInterface.showRequestNetDialog();}@Overridepublic void onSuccess(String str) {viewInterface.cancelRequestNetDialog();viewInterface.LoginSuccess(str);}@Overridepublic void onError() {viewInterface.cancelRequestNetDialog();viewInterface.LoginUnSuccess();}
}
- 归总下整个流程。
view层。
1.进入到LoginActivity后,先得到网络请求逻辑处理类的对象LoginModel.
2.得到LoginPresenter对象。
3.点击登录按钮的时候。view告诉presenter,你帮我请求下网络(调用LoginPresenter中请求网络的方法。)
presenter层
4.LoginPresenter告诉LoginModel启用请求网络的方法。(在LoginPresenter中请求网络的方法里调用网络请求逻辑处理类LoginModel去请求网络。)
5.LoginModel将请求结果回调给LoginPresenter,LoginPresenter通知view更改。
整个MVP的使用就讲完了,不懂的小伙伴最好自己动手实现一下。不懂的地方可以留言,有问题的地方欢迎指正。
完整代码已提交GitHub。地址:https://github.com/DevelopWb/MVP_DEMO.git
MVP架构实例讲解-登录界面相关推荐
- android开发实例之minitwitter登录界面 代码,Android实例miniTwitter登录界面
先上效果图: 布局分析:分成三个部分,该Activity是一个无标题的,设置无标题需要在setContentView之前设置,否则会报错: requestWindowFeature(Window.FE ...
- 这是一份全面 清晰的架构设计指南:MVC、MVP MVVM模式(含实例讲解)
前言 在Android开发中,当你梳理完需求后,你要做的并不是马上写下你的第一行代码,而是需先设计好整个项目的技术框架 今天,我将全面介绍Android开发中主流的技术框架MVC.MVP 与 MVVM ...
- 一文带你全面了解MVC、MVP、MVVM模式(实例讲解)
前言 在Android开发中,当你梳理完需求后,你要做的并不是马上写下你的第一行代码,而是需先设计好整个项目的技术框架 今天,我将全面介绍Android开发中主流的技术框架MVC.MVP 与 MVVM ...
- 【React Native开发】React Native控件之TextInput组件讲解与QQ登录界面实现(11)
转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50589570 本文出自:[江清清的博客] (一)前言 [好消息]个人 ...
- HTML5+CSS3小实例:不偷看密码的超萌猫头鹰登录界面
实例:不偷看密码的超萌猫头鹰登录界面 技术栈:HTML.CSS.jQuery jQuery下载地址:https://www.jb51.net/zt/jquerydown.htm 效果: 源码: < ...
- vb.net 简单登录界面(三层架构思想)
上篇博客介绍了面向过程思维设计的vb.net登录界面,这篇文章就简单介绍一下我用三层架构思想实现的vb.net登录功能吧,还请高手多多指点,初次使用三层架构思想,使用难免有错误之处! 1.登录界面主要 ...
- 有趣的HTML实例(七) 注册登录界面Ⅱ(css+js)
你知道,有些鸟儿是注定不会被关在牢笼里的,它们的每一片羽毛都闪耀着自由的光辉. --<肖申克的救赎> 目录 一.前言 二.往期作品回顾 三.作品介绍 四.本期代码介绍 五.效果显示 六.编 ...
- 有趣的HTML实例(十五) 注册登录界面(css+js)
我并不是每次吃完饭就看电视,有时我边吃边看电视,生活中有些改变会增加乐趣. --<加菲猫> 目录 一.前言 二.往期作品回顾 三.作品介绍 四.本期代码介绍 五.效果显示 六.编码实现 i ...
- HTMLCSS登录界面及讲解
PS:该源码非原创,原文章来自(2条消息) HTML+CSS登录界面_桐艾的博客-CSDN博客_登录页面 这里只做源码讲解 页面效果如下: 首先是login.html <!DOCTYPE h ...
- python脚本编辑器 v2ex_python3 模拟登录v2ex实例讲解
闲的无聊... 网上一堆,正好练手(主要是新手) # coding=utf-8 import requests from bs4 import BeautifulSoup headers = { 'u ...
最新文章
- 智在生活 自在慵懒 科沃斯机器人X京东大牌秒杀日主题展亮相无锡
- 传感器的“脖子”卡在哪儿?
- php函数介绍,PHP函数介绍_PHP教程
- 包含 PHP和nginx的镜像 supervisord.conf Dockerfile 案例
- Linux日志系统-04:logrotate命令格式
- 搭建一个Struts2工程
- 盘点关于Java在生活中的应用!
- 计算机免修考试题库,计算机免修考试内容和样卷.doc
- linux精简、备份还原、iso文件、批量安装?
- codeforces1452 E. Two Editorials
- c++ cdi+示例_C ++'not'关键字和示例
- 前端学习(3098):vue+element今日头条管理-关于富文本编辑器
- qt最大化和还原实现_Qt 窗口操作函数(置顶、全屏,最大化最小化按钮设置等)...
- Docker安装Redis并介绍漂亮的可视化客户端进行操作
- cc直播怎么显示服务器,CC直播像素杯四大服务器严阵以待 MC精彩赛事即刻开启...
- Vulnhub Typhoon-v1.02提权
- vue开发h5 公众号
- 浅谈虚拟机的垃圾回收
- android framelayout 高度,Android SupportLib – FrameLayout在CoordinatorLayout中与AppBarLayout消耗整个屏幕高度...
- FL Studio教程之Gross Beat插件讲解
热门文章
- ts文件怎么合并转换成mp4?
- linux图片转成pdf文件大小,Linux下实现图片转pdf以及pdf转图片的命令_沃航科技
- 【软考 系统架构设计师】软件架构设计⑦ 构件与中间件技术
- win10浏览器闪退_Win10专业版下Edge浏览器闪退的多种解决技巧
- dskinlite(uieasy mfc界面库)使用记录4:绘制动态元素(listbox)
- 数据库中的8种常见约束定义
- 怎么访问vmware虚拟机IIS网站
- 谷歌“Adobe Flash Player已被屏蔽”的解决办法
- ubnt路由器虚拟服务器,UBNT UAP系列 Wi-Fi设置教程 装修必看
- pdf文档安全权限去除