【移动应用开发技术】作为过来人对于Android MVP模式的一些详解_第1页
【移动应用开发技术】作为过来人对于Android MVP模式的一些详解_第2页
【移动应用开发技术】作为过来人对于Android MVP模式的一些详解_第3页
【移动应用开发技术】作为过来人对于Android MVP模式的一些详解_第4页
【移动应用开发技术】作为过来人对于Android MVP模式的一些详解_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】作为过来人,对于AndroidMVP模式的一些详解

闲来无事在家偶然翻到了之前整理的文档和面试要做到准备路线,虽然内容有点多,但是技多不压身,多多益善本部分内容是关于Android进阶的一些知识总结,涉及到的知识点比较杂,不过都是面试中几乎常问的知识点,也是加分的点。关于这部分内容,可能需要有一些具体的项目实践。在面试的过程中,结合具体自身实践经历,才能更加深入透彻的描绘出来

相关内容后续GitHub更新,想冲击金三银四的小伙伴可以找找看看,欢迎star(顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找)/xiangjiana/Android-MS(VX:m

相关内容后续GitHub更新,想冲击金三银四的小伙伴可以找找看看,欢迎star(顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找)/xiangjiana/Android-MS(VX:mMVP,MVC,MVVM此处延伸:手写mvp例子,与mvc之间的区别,mvp的优势MVP模式,对应着Model--业务逻辑和实体模型,view--对应着activity,负责View的绘制以及与用户交互,Presenter--负责View和Model之间的交互,MVP模式是在MVC模式的基础上,将Model与View彻底分离使得项目的耦合性更低,在Mvc中项目中的activity对应着mvc中的C--Controllor,而项目中的逻辑处理都是在这个C中处理,同时View与Model之间的交互,也是也就是说,mvc中所有的逻辑交互和用户交互,都是放在Controllor中,也就是activity中。View和model是可以直接通信的。而MVP模式则是分离的更加彻底,分工更加明确Model--业务逻辑和实体模型,view--负责与用户交互,Presenter负责完成View于Model间的交互,MVP和MVC最大的区别是MVC中是允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成。还有一点就是Presenter与View之间的交互是通过接口的MVP,全称Model-View-Presenter即模型-视图-层现器。提到MVP,就必须要先介绍一下它的前辈MVC,因为MVP正是基于MVC的基础发展而来的。两个之间的关系也是源远流长。MVC,全称Model-View-Controller,即模型-视图-控制器。具体如下:View:对应于布局文件Model:业务逻辑和实体模型Controllor:对应于Activity但是View对应于布局文件,其实能做的事情特别少,实际上关于该布局文件中的数据绑定的操作,事件处理的代码都在Activity中,造成了Activity既像View又像Controller,使得Activity变得臃肿。而当将架构改为MVP以后,Presenter的出现,将Actvity视为View层,Presenter负责完成View层与Model层的交互。现在是这样的:View对应于Activity,负责View的绘制以及与用户交互Model依然是业务逻辑和实体模型Presenter负责完成View于Model间的交互下面两幅图通过数据与视图之间的交互清楚地展示了这种变化:MVC模式下实际上就是Activty与Model之间交互,View完全独立出来了。MVP模式通过Presenter实现数据和视图之间的交互,简化了Activity的职责。同时即避免了View和Model的直接联系,又通过Presenter实现两者之间的沟通。总结:MVP模式减少了Activity的职责,简化了Activity中的代码,将复杂的逻辑代码提取到了Presenter中进行处理,模块职责划分明显,层次清晰。与之对应的好处就是,耦合度更低,更方便的进行测试。MVC中是允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成。还有一点就是Presenter与View之间的交互是通过接口的。还有一点注意:MVC中V对应的是布局文件,MVP中V对应的是Activity。大多数MVP模式的示例都使用登录案例进行介绍。因为简单方便,同时能提现出MVP的特点。今天我们也以此例进行学习。使用MVP的好处之一就是模块职责划分明显,层次清晰。该例的结构图即可展现此优点。在本例中,M0del层负责对从登录页面获取地帐号密码进行验证(一般需要请求服务器进行验证,本例直接模拟这一过程)。从上图的包结构图中可以看出,Model层包含内容:

①实体类bean②接口,表示Model层所要执行的业务逻辑③接口实现类,具体实现业务逻辑,包含的一些主要方法

①实体类bean②接口,表示Model层所要执行的业务逻辑③接口实现类,具体实现业务逻辑,包含的一些主要方法下面以代码的形式一一展开。①实体类beanpublicclassUser{

privateStringpassword;

privateStringusername;

publicStringgetPassword(){

returnpassword;

}

publicvoidsetPassword(Stringpassword){

this.password=password;

}

publicStringgetUsername(){

returnusername;

}

publicvoidsetUsername(Stringusername){

this.username=username;

}

@Override

publicStringtoString(){

return"User{"+

"password='"+password+'\''+

",username='"+username+'\''+

'}';

}

}封装了用户名、密码,方便数据传递。②接口publicinterfaceLoginModel{

voidlogin(Useruser,OnLoginFinishedListenerlistener);

}其中OnLoginFinishedListener是presenter层的接口,方便实现回调presenter,通知presenter业务逻辑的返回结果,具体在presenter层介绍。③接口实现类publicclassLoginModelImplimplementsLoginModel{

@Override

publicvoidlogin(Useruser,finalOnLoginFinishedListenerlistener){

finalStringusername=user.getUsername();

finalStringpassword=user.getPassword();

newHandler().postDelayed(newRunnable(){

@Overridepublicvoidrun(){

booleanerror=false;

if(TextUtils.isEmpty(username)){

listener.onUsernameError();//model层里面回调listener

error=true;

}

if(TextUtils.isEmpty(password)){

listener.onPasswordError();

error=true;

}

if(!error){

listener.onSuccess();

}

}

},2000);

}

}实现Model层逻辑:延时模拟登陆(2s),如果用户名或者密码为空则登陆失败,否则登陆成功。视图:将Modle层请求的数据呈现给用户。一般的视图都只是包含用户界面(UI),而不包含界面逻辑,界面逻辑由Presenter来实现。从上图的包结构图中可以看出,View包含内容:

①接口,上面我们说过Presenter与View交互是通过接口。其中接口中方法的定义是根据Activity用户交互需要展示的控件确定的。②接口实现类,将上述定义的接口中的方法在Activity中对应实现具体操作。

①接口,上面我们说过Presenter与View交互是通过接口。其中接口中方法的定义是根据Activity用户交互需要展示的控件确定的。②接口实现类,将上述定义的接口中的方法在Activity中对应实现具体操作。下面以代码的形式一一展开。①接口publicinterfaceLoginView{

//login是个耗时操作,我们需要给用户一个友好的提示,一般就是操作ProgressBarvoidshowProgress();

voidhideProgress();

//login当然存在登录成功与失败的处理,失败给出提示voidsetUsernameError();

voidsetPasswordError();

//login成功,也给个提示

voidshowSuccess();

}上述5个方法都是presenter根据model层返回结果需要view执行的对应的操作。②接口实现类即对应的登录的Activity,需要实现LoginView接口。publicclassLoginActivityextendsAppCompatActivityimplementsLoginView,View.OnClickListener{

privateProgressBarprogressBar;

privateEditTextusername;

privateEditTextpassword;

privateLoginPresenterpresenter;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_login);

progressBar=(ProgressBar)findViewById(R.gress);

username=(EditText)findViewById(R.id.username);

password=(EditText)findViewById(R.id.password);

findViewById(R.id.button).setOnClickListener(this);

//创建一个presenter对象,当点击登录按钮时,让presenter去调用model层的login()方法,验证帐号密码

presenter=newLoginPresenterImpl(this);

}

@Override

protectedvoidonDestroy(){

presenter.onDestroy();

super.onDestroy();

}

@Override

publicvoidshowProgress(){

progressBar.setVisibility(View.VISIBLE);

}

}View层实现Presenter层需要调用的控件操作,方便Presenter层根据Model层返回的结果进行操作View层进行对应的显示。Presenter是用作Model和View之间交互的桥梁。从上图的包结构图中可以看出,Presenter包含内容:

①接口,包含Presenter需要进行Model和View之间交互逻辑的接口,以及上面提到的Model层数据请求完成后回调的接口。②接口实现类,即实现具体的Presenter类逻辑。

①接口,包含Presenter需要进行Model和View之间交互逻辑的接口,以及上面提到的Model层数据请求完成后回调的接口。②接口实现类,即实现具体的Presenter类逻辑。下面以代码的形式一一展开。①接口publicinterfaceOnLoginFinishedListener{

voidonUsernameError();

voidonPasswordError();

voidonSuccess();

}当Model层得到请求的结果,需要回调Presenter层,让Presenter层调用View层的接口方法。publicinterfaceLoginPresenter{

voidvalidateCredentials(Useruser);

voidonDestroy();

}登陆的Presenter的接口,实现类为LoginPresenterImpl,完成登陆的验证,以及销毁当前view。②接口实现类publicclassLoginPresenterImplimplementsLoginPresenter,OnLoginFinishedListener{

privateLoginViewloginView;

privateLoginModelloginModel;

publicLoginPresenterImpl(LoginViewloginView){

this.loginView=loginView;

this.loginModel=newLoginModelImpl();

}

@Override

publicvoidvalidateCredentials(Useruser){

if(loginView!=null){

loginView.showProgress();

}

loginModel.login(user,this);

}

@Override

publicvoidonDestroy(){

loginView=null;

}

@Override

pub

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论