1.2 架构设计模式-MVP
MVP是从经典的MVC模式演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。在Android开发中,MVP的具体实现流程是当Presenter接收到View的请求,便从Model层获取数据,将数据进行处理。处理好的数据再通过View层的接口回调给Activity或Fragment。这样MVP能够让Activity或Fragment成为真正的View,只做与UI相关的事而不处理其他业务流程。
(1) 定义
-
M(Model)层:实体模型,处理
业务逻辑
。如:数据库操作,网络操作,I/O操作,复杂操作和耗时任务等。 -
V(View)层:负责
View的绘制以及与用户交互
。在Android开发中,它一般对应着xml布局文件和Activity/Fragment。 -
P(Presenter)层:负责完成Model层和View层间的数据
交互
和业务逻辑
。
(2) 实例
(3) MVC和MVP的区别
MVP中的View并不直接使用Model,它们之间的通信是通过Presenter来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不通过Controller
-
MVC和MVP的最大区别:MVC的Model层和View层
能够直接交互
;MVP的Model层和View层不能直接交互
,需通过Presenter层来进行交互。 -
Activity职责不同:Activity在MVC中属于Controller层,在MVP中属于View层,这是MVC和MVP很主要的一个区别。可以说Android从MVC转向MVP开发也主要是
优化Activity的代码,避免Activity的代码臃肿庞大
。 -
View层不同:MVC的View层指的是XML布局文件(或用Java自定义的View);MVP的View层是Activity(或Fragment)
-
控制层不同:MVC的控制层是Activity(或Fragment);MVP的控制层是Presenter,里面没有很多的实际东西,主要负责Model层和View层的交互。
(4) MVP优缺点
- MVP的优点如下:
模型与视图完全分离,我们可以修改视图而不影响模型;项目代码结构清晰,一看就知道什么类干什么事情;我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑,这个特性非常的有用,因为视图的变化总是比模型的变化更频繁 ;协同工作(例如在设计师没出图之前可以先写一些业务逻辑代码)
- MVP也有不足之处:
接口过多,一定程度影响了编码效率。一定程度上导致Presenter的代码量过大。
为了降低Presenter中业务繁多的问题,Google又推出了MVVM,试图通过数据驱动来减少Presenter的代码量。
1.3 架构设计模式-MVVM
(1) 定义
-
M(Model)层:仍然是
实体模型
(但是不同于之前定义的Model层),主要负责数据获取、存储和变化,提供数据接口供 ViewModel 层调用。 -
V(View)层:对应
Activity/Feagment
和xml布局
文件 ,负责View的绘制以及与用户交互
说明:View层仅能操作UI(数据绑定来实现 UI 更新);不能做任何和业务逻辑有关的数据操作
- VM(ViewModel)层:负责完成Model层和View层间的数据
交互
和业务逻辑
说明:ViewModel层仅能做和业务逻辑有关的数据操作;不能做UI相关的操作
============================================================================
插件化来由:随着业务的增多,业务逻辑代码越来越多,apk包也逐渐增大,不利于维护和升级。通过插件化开发可将功能模块解耦,不同的维护团队仅维护某模块的业务,同时当app升级时可仅对某功能模块进行升级而不需整体升级。
2.1 插件化要解决的问题—如何动态加载apk
(1) android类加载器及区别
类加载器作用:java字节码通过类加载器加载到java虚拟器。
-
PathClassLoader:仅能加载文件目录下的apk。
-
DexClassLoader:可以加载apk文件中的字节码(从dex实体jar文件中加载java字节码)。主要用于动态加载和代码热更新等。
(2)反射: java中的反射使我们在运行时获得这个类的属性、方法和class内部的信息机制,最重要的是我们可以在运行时实例化这个对象调用方法,这也是java反射的最大优点。
(3) 实现动态加载apk
什么是动态加载apk:android中有一个速度程序会主动到指定的sd卡中去加载apk,并通过代理activity去执行。
实现:需要一个代理activity去执行apk中的activity,主要通过反射去获得它的属性和方法,从而进行apk的调用。
实现原理:类加载器
(加载类)+反射
(获取属性和方法)+动态代理
(执行)
如:
2.2 插件化要解决的问题—如何加载资源
通过android中ServiceManager类的隐藏方法来加载资源。
2.3 插件化要解决的问题—如何加载代码
使用java中的类加载机制,但是android和java也有一点不一样,android比java多了组件和生命周期,所以并不是类加载进来就能使用(不能管理生命周期)。
=====================================================================================
(1) 热更新流程
-
检测到线上严重的crash(参考:app检测crash并发送日志到服务器的实现)
-
线上版本拉出bugfix分支并在分支上修复问题
-
jenkins构建及生成补丁
-
app在合适时机通过推送或主动拉取补丁文件
-
将bugfix代码合并到master上
(2) 热更新主流框架
-
Dexposed
-
AndFix
-
NuWa
(3) 热更新原理
- Android类加载机制(类加载器)
PathClassLoader类:用来加载系统类
DexClassLoader:用来加载dex文件、jar文件包和apk包等
- 热修复机制(原理)
原理:在ClassLoader中创建一个dexElements数组,根据线上的crash定位找到对应的类文件,然后把这个类文件修复完成后打包成一个dex文件并放到dexElements数组的最前方。那么当ClassLoader遍历dexElements数组(加载数组中的dex文件)时,因为ClassLoader会优先加载最前方的dex文件,所以不会加载线上有crash的dex文件,只会加载修复完的dex文件,从而完成热修复过程。
=============================================================================
(1) 进程保活概念
进程保活:让进程在
内存
中永远存在且无法杀死,就算被杀死也能保活。
进程被杀死的原因:人为地调用kill;被第三方安全软件杀死。
文末
那么对于想坚持程序员这行的真的就一点希望都没有吗?
其实不然,在互联网的大浪淘沙之下,留下的永远是最优秀的,我们考虑的不是哪个行业差哪个行业难,就逃避掉这些,无论哪个行业,都会有他的问题,但是无论哪个行业都会有站在最顶端的那群人。我们要做的就是努力提升自己,让自己站在最顶端,学历不够那就去读,知识不够那就去学。人之所以为人,不就是有解决问题的能力吗?挡住自己的由于只有自己。点击我的GitHub下述资料免费领取
Android希望=技能+面试
-
技能
-
面试技巧+面试题
lob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)**
Android希望=技能+面试 -
技能
[外链图片转存中…(img-xh82coM7-1646387357422)] -
面试技巧+面试题