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架构实例讲解-登录界面相关推荐

  1. android开发实例之minitwitter登录界面 代码,Android实例miniTwitter登录界面

    先上效果图: 布局分析:分成三个部分,该Activity是一个无标题的,设置无标题需要在setContentView之前设置,否则会报错: requestWindowFeature(Window.FE ...

  2. 这是一份全面 清晰的架构设计指南:MVC、MVP MVVM模式(含实例讲解)

    前言 在Android开发中,当你梳理完需求后,你要做的并不是马上写下你的第一行代码,而是需先设计好整个项目的技术框架 今天,我将全面介绍Android开发中主流的技术框架MVC.MVP 与 MVVM ...

  3. 一文带你全面了解MVC、MVP、MVVM模式(实例讲解)

    前言 在Android开发中,当你梳理完需求后,你要做的并不是马上写下你的第一行代码,而是需先设计好整个项目的技术框架 今天,我将全面介绍Android开发中主流的技术框架MVC.MVP 与 MVVM ...

  4. 【React Native开发】React Native控件之TextInput组件讲解与QQ登录界面实现(11)

    转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50589570 本文出自:[江清清的博客] (一)前言 [好消息]个人 ...

  5. HTML5+CSS3小实例:不偷看密码的超萌猫头鹰登录界面

    实例:不偷看密码的超萌猫头鹰登录界面 技术栈:HTML.CSS.jQuery jQuery下载地址:https://www.jb51.net/zt/jquerydown.htm 效果: 源码: < ...

  6. vb.net 简单登录界面(三层架构思想)

    上篇博客介绍了面向过程思维设计的vb.net登录界面,这篇文章就简单介绍一下我用三层架构思想实现的vb.net登录功能吧,还请高手多多指点,初次使用三层架构思想,使用难免有错误之处! 1.登录界面主要 ...

  7. 有趣的HTML实例(七) 注册登录界面Ⅱ(css+js)

    你知道,有些鸟儿是注定不会被关在牢笼里的,它们的每一片羽毛都闪耀着自由的光辉. --<肖申克的救赎> 目录 一.前言 二.往期作品回顾 三.作品介绍 四.本期代码介绍 五.效果显示 六.编 ...

  8. 有趣的HTML实例(十五) 注册登录界面(css+js)

    我并不是每次吃完饭就看电视,有时我边吃边看电视,生活中有些改变会增加乐趣. --<加菲猫> 目录 一.前言 二.往期作品回顾 三.作品介绍 四.本期代码介绍 五.效果显示 六.编码实现 i ...

  9. HTMLCSS登录界面及讲解

    PS:该源码非原创,原文章来自(2条消息) HTML+CSS登录界面_桐艾的博客-CSDN博客_登录页面 这里只做源码讲解  页面效果如下:  首先是login.html <!DOCTYPE h ...

  10. python脚本编辑器 v2ex_python3 模拟登录v2ex实例讲解

    闲的无聊... 网上一堆,正好练手(主要是新手) # coding=utf-8 import requests from bs4 import BeautifulSoup headers = { 'u ...

最新文章

  1. 智在生活 自在慵懒 科沃斯机器人X京东大牌秒杀日主题展亮相无锡
  2. 传感器的“脖子”卡在哪儿?
  3. php函数介绍,PHP函数介绍_PHP教程
  4. 包含 PHP和nginx的镜像 supervisord.conf Dockerfile 案例
  5. Linux日志系统-04:logrotate命令格式
  6. 搭建一个Struts2工程
  7. 盘点关于Java在生活中的应用!
  8. 计算机免修考试题库,计算机免修考试内容和样卷.doc
  9. linux精简、备份还原、iso文件、批量安装?
  10. codeforces1452 E. Two Editorials
  11. c++ cdi+示例_C ++'not'关键字和示例
  12. 前端学习(3098):vue+element今日头条管理-关于富文本编辑器
  13. qt最大化和还原实现_Qt 窗口操作函数(置顶、全屏,最大化最小化按钮设置等)...
  14. Docker安装Redis并介绍漂亮的可视化客户端进行操作
  15. cc直播怎么显示服务器,CC直播像素杯四大服务器严阵以待 MC精彩赛事即刻开启...
  16. Vulnhub Typhoon-v1.02提权
  17. vue开发h5 公众号
  18. 浅谈虚拟机的垃圾回收
  19. android framelayout 高度,Android SupportLib – FrameLayout在CoordinatorLayout中与AppBarLayout消耗整个屏幕高度...
  20. FL Studio教程之Gross Beat插件讲解

热门文章

  1. ts文件怎么合并转换成mp4?
  2. linux图片转成pdf文件大小,Linux下实现图片转pdf以及pdf转图片的命令_沃航科技
  3. 【软考 系统架构设计师】软件架构设计⑦ 构件与中间件技术
  4. win10浏览器闪退_Win10专业版下Edge浏览器闪退的多种解决技巧
  5. dskinlite(uieasy mfc界面库)使用记录4:绘制动态元素(listbox)
  6. 数据库中的8种常见约束定义
  7. 怎么访问vmware虚拟机IIS网站
  8. 谷歌“Adobe Flash Player已被屏蔽”的解决办法
  9. ubnt路由器虚拟服务器,UBNT UAP系列 Wi-Fi设置教程 装修必看
  10. pdf文档安全权限去除