android自动登录简书,Android开发中的MVP模式模拟登录实践

MVP模式是安卓开发中常用的开发框架模式,面试中也经常会被问到MVC,MVP,MVVM的异同和优缺点。所以自己也复习了下MVP,顺便撸了个MVP的基础实现,分享一下.

首先介绍下MVC与MVP,这也是面试必问的知识点

概念

MVC:

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示和业务逻辑层。

分层

M层:适合做一些业务逻辑处理,比如数据库存取操作,网络操作,复杂的算法,耗时的任务等都在model层处理。 V层:应用层中处理数据显示的部分,XML布局可以视为V层,显示Model层的数据结果。 C层:在Android中,Activity处理用户交互问题,因此可以认为Activity是控制器,Activity读取V视图层的数据(eg.读取当前EditText控件的数据),控制用户输入(eg.EditText控件数据的输入),并向Model发送数据请求(eg.发起网络请求等)。

优点:

耦合性低。所谓耦合性就是模块代码之间的关联程度。利用MVC框架使得View(视图)层和Model(模型)层可以很好的分离,这样就达到了解耦的目的,所以耦合性低,减少模块代码之间的相互影响。

可扩展性好。由于耦合性低,添加需求,扩展代码就可以减少修改之前的代码,降低bug的出现率。

模块职责划分明确。主要划分层M,V,C三个模块,利于代码的维护。

MVP

MVP模式(Model-View-Presenter)可以说是MVC模式(Model-View-Controller)在Android开发上的一种变种、进化模式.在MVC模式中,Activity应该是属于View这一层。而实质上,它既承担了View,同时也包含一些Controller的东西在里面。这对于开发与维护来说不太友好,耦合度大高了。把Activity的View和Controller抽离出来就变成了View和Presenter,这就是MVP模式。

分层

MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成Presenter接口,Model类还是原来的Model。

这就是MVP模式,现在这样的话,Activity的工作的简单了,只用来响应生命周期,其他工作都丢到Presenter中去完成。从上图可以看出,Presenter是Model和View之间的桥梁,为了让结构变得更加简单,View并不能直接对Model进行操作,这也是MVP与MVC最大的不同之处。

优点:

分离了视图逻辑和业务逻辑,降低了耦合

Activity只处理生命周期的任务,代码变得更加简洁

视图逻辑和业务逻辑分别抽象到了View和Presenter的接口中去,提高代码的可阅读性

Presenter被抽象成接口,可以有多种具体的实现,所以方便进行单元测试

把业务逻辑抽到Presenter中去,避免后台线程引用着Activity导致Activity的资源无法被系统回收从而引起内存泄露和OOM

MVP模拟登录栗子

动图展示

aab08c200a31?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

包结构

aab08c200a31?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

在mvp目录下,定义了model,view,presenter三个包:

首先是activity,大多数项目中会有一个activity的包;

model下存放了实体,及定义的登录接口和接口实现类;

view层下面存放了activity的UI逻辑view接口;

presenter则是存放了model,view之间的桥梁presenter类(实际上presenter层也可以定义一个IPresenter接口并创建对应实现类,这里我就不多写接口了)

可以看到MVP模式中有一个特点就是类比较多,比MVC要多一些,但是每个类中的代码少,由于我们定义了很多接口,所以逻辑明确,可阅读性和可维护性非常高

代码:

1.activit创建,xml编写;

2.VIEW:在IloginView中定义activity的UI逻辑,且让Activity实现这个接口:

public interface ILoginView {

void loginSuccess(UserData data);

void loginFail(String result);

void showLoading();

void hideLoading();

}

3.MODEL:定义实体LoginParam和UserData,对应登录参数及返回数据;

public class LoginParam {

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getUserPwd() {

return userPwd;

}

public void setUserPwd(String userPwd) {

this.userPwd = userPwd;

}

public LoginParam(String name,String pwd){

this.userName = name;

this.userPwd = pwd;

}

private String userName;

private String userPwd;

}

4.MODEL:定义Ilogin接口和IloginListener

public interface ILoginListener {

void loginSuccess(UserData data);

void loginFailed(String result);

}

public interface ILogin {

void goLogin(LoginParam param, ILoginListener iLoginListener);

}

5.MODEL:LoginModel实现登录模拟网络请求:

public class LoginModel implements ILogin {

@Override

public void goLogin( final LoginParam param, final ILoginListener iLoginListener) {

//模拟子线程网络请求

new Thread(new Runnable() {

@Override public void run() {

if ("dsh".equals(param.getUserName()) && "123456".equals(param.getUserPwd())) {

UserData data = new UserData("dsh",true);

data.setLoginSuccess(true);

data.setUserName("dsh");

iLoginListener.loginSuccess(data);

} else {

iLoginListener.loginFailed("账号或密码错误");

}

}

}).start();

}

}

6.PRESENTER:LoginPresenter编写,传入model和view,构造函数及登录方法

public LoginPresenter(ILoginView loginView) {

this.mView = loginView;

this.mModel= new LoginModel();

}

public void goLogin(final LoginParam param){

mView.showLoading();

mModel.goLogin(param, new ILoginListener() {

@Override

public void loginSuccess( final UserData data) {

//handler交给主线程更新UI

mHandler.postDelayed(new Runnable() {

@Override

public void run() {

mView.hideLoading();

mView.loginSuccess(data);

}

},2000);

}

@Override

public void loginFailed( final String result) {

mHandler.postDelayed(new Runnable() {

@Override

public void run() {

mView.hideLoading();

mView.loginFail(result);

}

},2000);

}

});

}

7.activity,presenter初始化,,点击事件,处理登陆成功和登录失败的UI逻辑,跳转等

//初始化presenter

mPresenter = new LoginPresenter(this);

//点击登录

button.setOnClickListener(new View.OnClickListener() {

@Override public void onClick(View v) {

if (TextUtils.isEmpty(tvPwd.getText().toString().trim()) ||

TextUtils.isEmpty(tvUsername.getText().toString())) {

Toast.makeText(MVPLoginActivity.this, "用户名或密码不能为空",

Toast.LENGTH_SHORT).show();

} else {

LoginParam param = new LoginParam(tvUsername.getText().toString().trim(),

tvPwd.getText().toString().trim());

mPresenter.goLogin(param);

}

}

});

//登陆成功和登录失败UI逻辑

@Override

public void loginSuccess(UserData data) {

Toast.makeText(MVPLoginActivity.this, "登录成功"+data.getUserName(),

Toast.LENGTH_SHORT).show();

}

@Override

public void loginFail(String result) {

Toast.makeText(MVPLoginActivity.this, "登录失败:" + result,

Toast.LENGTH_SHORT).show();

}

至此,一个MVP模拟登录的功能就实现了,比较简单.

项目代码:Android开发之MVP模式模拟登录

项目开发中,一般需要更好的封装或者框架解决方案,

推荐看下MVPArms:MVPArms

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值