2024年Android最全Android 架构MVC MVP MVVM+实例,2024年最新事件分发面试题

本文介绍了Android开发中MVC、MVP和MVVM三种设计模式的区别,强调了系统化学习的重要性,指出浅尝辄止的学习难以提升技术。同时还提供了相关学习资源和鼓励加入技术交流社群以共同成长。
摘要由CSDN通过智能技术生成

总结

最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上我整理的几十套腾讯、字节跳动,京东,小米,头条、阿里、美团等公司19年的Android面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

技术进阶之路很漫长,一起共勉吧~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

为了一个应用可以更好的维护和扩展,我们需要很好的区分相关层级,要不然以后将数据获取方式从数据库变为网络获取时,我们需要去修改整个Activity。架构使得View和数据相互独立,我们把应用分成三个不同层级,这样我们就能够单独测试相关层级,使用架构能够把大多数逻辑从Activity中移除,方便进行单元测试。

MVC是什么?

=======

MVC是模型(Model)-视图(View)-控制器(Controller)的缩写,用一种业务逻辑、数据、界面显示分离的方法组织代码。其实Android Studio创建一个项目的模式就是一个简化的mvc模式。

Android中的MVC含义


  • Model:实体类(数据的获取、存储、数据状态变化)。

  • View:布局文件

  • Controller:Activity(处理数据、业务和UI)。

工作原理


  • 1.View接受用户的交互请求。

  • 2.View将请求转交给Controller。

  • 3.Controller操作Model进行数据更新。

  • 4.数据更新之后,Model通知View数据变化。

  • 5.View显示更新之后的数据。

MVC的缺点


随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。

为了解决MVC的缺点,MVP 框架被提出来。

MVP是什么

======

MVP是MVC架构的一个演化版,全称是Model-View-Presenter。将MVC中的V和C结合生成MVP中的V,引入新的伙伴Presenter。

Android中的MVP含义


  • Model:实体类(数据的获取、存储、数据状态变化)。

  • View:布局文件+Activity。

  • Presenter:中介,负责完成View与Model间的交互和业务逻辑。

工作原理


  • 1.View 接收用户交互请求

  • 2.View 将请求转交给 Presenter(V调用P接口)

  • 3.Presenter 操作Model进行数据更新(P调用M接口)

  • 4.Model 通知Presenter数据发生变化(M调用P接口)

  • 5.Presenter 更新View数据(P执行接口,V相应回调)

MVP的优点


  • 1.复杂的逻辑处理放在Presenter进行处理,减少了Activity的臃肿。

  • 2.解耦。Model层与View层完全分离,修改V层不会影响M层,降低了耦合性。

  • 3.可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。

  • 4.Presenter层与View层的交互是通过接口来进行的,便于单元测试。

MVP的缺点


维护困难。Presenter中除了业务逻辑以外,还有大量的View->Model,Model->View的手动同步逻辑,造成Presenter比较笨重,维护起来会比较困难。

MVVM是什么

=======

是 Model-View-ViewModel 的简写。MVVM与MVP的结构还是很相似的,就是将Presenter升级为ViewModel。在MVVM中,View层和Model层进行了双向绑定(即Data Binding),所以Model数据的更改会表现在View上,反之亦然。ViewModel就是用来根据具体情况处理View或Model的变化。

Android中的MVVM含义


  • Model:实体类(数据的获取、存储、数据状态变化)。

  • View:布局文件+Activity。

  • ViewModel: 关联层,将Model和View进行绑定,Model或View更改时,实时刷新对方。

工作原理


  • 1.View 接收用户交互请求

  • 2.View 将请求转交给ViewModel

  • 3.ViewModel 操作Model数据更新

  • 4.Model 更新完数据,通知ViewModel数据发生变化

  • 5.ViewModel 更新View数据

View/Model的变动,只要改其中一方,另一方都能够及时更新到

MVVM的优点


  • 1.提高可维护性。Data Binding可以实现双向的交互,使得视图和控制层之间的耦合程度进一步降低,分离更为彻底,同时减轻了Activity的压力。

  • 2.简化测试。因为同步逻辑是交由Binder做的,View跟着Model同时变更,所以只需要保证Model的正确性,View就正确。大大减少了对View同步更新的测试。

  • 3.ViewModle易于单元测试。

MVVM的缺点


  • 1.对于简单的项目,使用MVVM有点大材小用。

  • 2.对于过大的项目,数据绑定会导致内存开销大,影响性能。

  • 3.ViewModel和View的绑定,使页面异常追踪变得不方便。有可能是View出错,也有可能是ViewModel的业务逻辑有问题,也有可能是Model的数据出错。

MVP和MVC的最大区别

============

在MVP中View并不直接使用Model,它们之间的通信是通过Presenter 来进行的,所有的交互都发生在Presenter内部,而在MVC中View直接从Model中读取数据而不是通过 Controller。

如何选取框架

======

本来是要每个模式写一个适用场景,最后想想每个人都有自己的理解,别被他人束缚了。

一句话:适合自己的才是最好的!

实例

==

就这么一个界面咱通过MVC、MVP、MVVM分别搭建一下。

MVC实例


代码结构

1.在layout创建一个布局文件

<LinearLayout

…>

<EditText

android:id=“@+id/et_account”

…/>

<LinearLayout

…>

<EditText

android:id=“@+id/et_password”

…/>

<Button

android:id=“@+id/btn_login”

…/>

<Button

android:id=“@+id/btn_back”

…/>

2.实体类(User)

public class User {

private String name;

private String password;

public User() {}

//set or get …

public User(String name, String password) {

this.name = name;

this.password = password;

}

}

3.MVCLoginActivity

//用户点击事件

mvcBinding.mcvLogin.btnLogin.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

user.setName(mvcBinding.mcvLogin.etAccount.getText().toString());

user.setPassword(mvcBinding.mcvLogin.etPassword.getText().toString());

login(user);

}

});

//逻辑处理

private void login(User user){

if(!user.getName().isEmpty()&&!user.getPassword().isEmpty()){

if(user.getName().equals(“scc001”)&&user.getPassword().equals(“111111”))

{

Toast.makeText(this,“登录成功”,Toast.LENGTH_SHORT).show();

}else{

Toast.makeText(this,“登录失败”,Toast.LENGTH_SHORT).show();

}

}else {

Toast.makeText(this,“登录失败”,Toast.LENGTH_SHORT).show();

}

}

MVP实例


代码结构

1.Model层

实体类bean,同MVC中的User类,就不贴代码浪费大家时间了。

Model层所要执行的业务逻辑

/**

* 功能:接口,表示Model层所要执行的业务逻辑

*/

public interface LoginModel {

//User实体类;OnLoginFinishedListener presenter业务逻辑的返回结果

void login(User user, OnLoginFinishedListener listener);

}

实现类(实现LoginModel接口)

/**

* 功能:实现Model层逻辑

*/

public class LoginModelImpl implements LoginModel {

//第4步:验证帐号密码

@Override

public void login(User user, OnLoginFinishedListener listener) {

if(user.getName().isEmpty()||!user.getName().equals(“scc001”)){

//第5步:Model层里面回调Presenter层listener

listener.onUserNameError();

}else if(user.getPassword().isEmpty()||!user.getPassword().equals(“111111”)){

//第5步:Model层里面回调Presenter层listener

listener.onPasswordError();

}else {

//第5步:Model层里面回调Presenter层listener

listener.onSuccess();

}

}

}

2.Presenter层

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

/**

* 功能:当Model层得到请求的结果,回调Presenter层,让Presenter层调用View层的接口方法。

*/

public interface OnLoginFinishedListener {

void onUserNameError();

void onPasswordError();

void onSuccess();

}

完成登录的验证,以及销毁当前View。

/**

* 功能:登录的Presenter的接口,实现类为LoginPresenterImpl,

* 完成登录的验证,以及销毁当前View。

*/

public interface LoginPresenter {

//完成登录的验证

void verifyData(User user);

//销毁当前View

void onDestroy();

}

Presenter实现类,引入 LoginModel(model)和LoginView(view)的引用

/**

* 功能:实现类,引入 LoginModel(model)和LoginView(view)的引用

*/

public class LoginPresenterImpl implements OnLoginFinishedListener, LoginPresenter {

//View层接口

private LoginView loginView;

//Model层接口

private LoginModel loginModel;

public LoginPresenterImpl(LoginView loginView) {

this.loginView = loginView;

this.loginModel = new LoginModelImpl();

}

//第6步:通过OnLoginFinishedListener验证结果回传到Presenter层

@Override

public void onUserNameError() {

if (loginView != null) {

//第7步:通过loginView回传到View层

loginView.setUserNameError();

loginView.hideProgress();

}

}

//第6步:通过OnLoginFinishedListener验证结果回传到Presenter层

@Override

public void onPasswordError() {

if (loginView != null) {

//第7步:通过loginView回传到View层

loginView.setPasswordError();

loginView.hideProgress();

}

}

//第6步:通过OnLoginFinishedListener验证结果回传到Presenter层

@Override

public void onSuccess() {

if (loginView != null) {

//第7步:通过loginView回传到View层

loginView.success();

loginView.hideProgress();

}

}

@Override

public void verifyData(User user) {

if (loginView != null) {

loginView.showProgress();

}

//第3步:调用model层LoginModel接口的login()方法

loginModel.login(user,this);

}

@Override

public void onDestroy() {

loginView = null;

}

}

推荐学习资料

  • Android进阶学习全套手册

  • Android对标阿里P7学习视频

  • BAT TMD大厂Android高频面试题

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

View.success();

loginView.hideProgress();

}

}

@Override

public void verifyData(User user) {

if (loginView != null) {

loginView.showProgress();

}

//第3步:调用model层LoginModel接口的login()方法

loginModel.login(user,this);

}

@Override

public void onDestroy() {

loginView = null;

}

}

推荐学习资料

  • Android进阶学习全套手册

    [外链图片转存中…(img-S08fJU6m-1714826619248)]

  • Android对标阿里P7学习视频

    [外链图片转存中…(img-4Lf647Q1-1714826619248)]

  • BAT TMD大厂Android高频面试题

[外链图片转存中…(img-4Y8hituh-1714826619249)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值