【404 笔记】总结

mvc mvp mvvm

https://juejin.cn/post/6914971761163370509

MVC中三个组成部分:1. View,即视图中的各个控件;2. Controller,即Activity、Fragment;3. Model,即数据源。
但是日常开发中能够发现,对View层的控制也是在Activity中,这时引入Model层数据源的获取再与Controller层发生交互时,不难发现MVC三层互相都存在持有关系,也就产生了严重的耦合。


MVP的架构实现就是将控制层下移,View层充当Activity、Fragment的存在,Model层保持原样作为数据源的获取层存在,而View和Model层的通信通过中间人Presenter来完成数据的传递,通过这样的方式达到了解耦的目的。

通信的方式就是互相持有,但中间人对于View层的持有使用弱引用的方式实现,以保证View的及时释放。


MVVM架构其实和MVP架构整体上相似,但是ViewModel层和View层属于双向通信,使用了DataBinding的能力,使得ViewModel的生成、与View层的绑定完全由系统直接完成简化了开发的流程。但是从设计上出发的时候,MVP更有利于我们对于整体架构的理解 ,但是从开发成本上来讲是优于MVP架构的。
ViewModel - LiveData 已经得到了广大开发者的认可,ViewModel 和LiveData 的结合,使得Android中数据可控性变得更好,耦合度更低
区别:
MVP和MVC最大的区别是MVC中是允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成。还有一点就是Presenter与View之间的交互是通过接口的

谈谈消息机制Handler作用 ?有哪些要素 ?流程是怎样的 ?

Android中主线程是不能进行耗时操作的,子线程是不能进行更新UI的。所以就有了handler,它的作用就是实现线程之间的通信。

handler整个流程中,主要有四个对象,handler,Message,MessageQueue,Looper。当应用创建的时候,就会在主线程中创建handler对象,

我们通过要传送的消息保存到Message中,handler通过调用sendMessage方法将Message发送到MessageQueue中,Looper对象就会不断的调用loop()方法

不断的从MessageQueue中取出Message交给handler进行处理。从而实现线程之间的通信。。

解决方式
1.静态内部类
2.弱引用
3.注意在onDestroy中移除消息
https://www.jianshu.com/p/70d5785ee4c3

精选Android初中级面试题 (三): 深探Handler,多线程,Bitmap (包含以上内容)
https://mp.weixin.qq.com/s?__biz=Mzg2MTYzNzM5OA==&mid=2247509915&idx=1&sn=18c59c61ad818fce9a9b26f815c63d93&source=41#wechat_redirect

屏幕适配

在这里插入图片描述
公认比较好的屏幕适配方案有基于最小宽度 SmallWidth和 基于头条适配方案的 AndroidAutoSize。
https://juejin.cn/post/6921707764234502151/

https://juejin.cn/post/6903344875136745479

性能优化

ANR,内存溢出,内存抖动,内存泄漏,UI卡顿,冷启动优化等方面来回答。
比如最常见的:
ANR全名Application Not Responding, 也就是"应用无响应". 当操作在一段时间内系统无法处理时, 系统层面会弹出上图那样的ANR对话框.

产生原因:

(1)5s内无法响应用户输入事件(例如键盘输入, 触摸屏幕等).

(2)BroadcastReceiver在10s内无法结束

(3)Service 20s内无法结束(低概率)

解决方式:

(1)不要在主线程中做耗时的操作,而应放在子线程中来实现。如onCreate()和onResume()里尽可能少的去做创建操作。

(2)应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。

(3)避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。

(4)service是运行在主线程的,所以在service中做耗时操作,必须要放在子线程中。
面试性能参考链接
https://www.php.cn/website-design-ask-457081.html
Android性能优化总结 非文正
1.硬件加速

GPU的绘制包含软绘制和硬绘制,可以在代码或者AndroidManifest.xml文件中开启硬件加速,有时候硬件加速会引起一些问题,需要合理调用。
非所有的2D绘图操作支持硬件加速,如果您的程序中使用了自定义视图或者绘图调用,程序可能会工作不正常
2.绘制流程优化

绘制流程的三大关键步骤,会分别调用onMessure、onLayout、OnDraw,三个过程会从根节点开始遍历子节点,因此从绘制流程来看,优化的方法有:

a.布局优化,减少布局层次

b.使用合理的布局,其中效率方面FrameLayout>LinearLayout>RelativeLayout(相同层次的情况下)

c.这三大方法里面不要做耗时操作

d.布局中合理使用include、merge、ViewStub方式加载布局

e.特别的ListView的优化,复用convertView ,使用VIewHolder减少findViewById操作,使用tag保存ViewHolder等等
https://blog.csdn.net/newhope1106/article/details/70666552


java基础以及 网络框架对比
https://www.php.cn/website-design-ask-457079.html

自定义view

1、组合控件。这种自定义控件不需要我们自己绘制,而是使用原生控件组合成的新控件。如标题栏。

2、继承原有的控件。这种自定义控件在原生控件提供的方法外,可以自己添加一些方法。如制作圆角,圆形图片。

3、完全自定义控件:这个View上所展现的内容全部都是我们自己绘制出来的。比如说制作水波纹进度条。

View的绘制流程:OnMeasure()——>OnLayout()——>OnDraw()

第一步:OnMeasure():测量视图大小。从顶层父View到子View递归调用measure方法,measure方法又回调OnMeasure。

第二步:OnLayout():确定View位置,进行页面布局。从顶层父View向子View的递归调用view.layout方法的过程,即父View根据上一步measure子View所得到的布局大小和布局参数,将子View放在合适的位置上。

第三步:OnDraw():绘制视图。ViewRoot创建一个Canvas对象,然后调用OnDraw()。六个步骤:①、绘制视图的背景;②、保存画布的图层(Layer);③、绘制View的内容;④、绘制View子视图,如果没有就不用;

⑤、还原图层(Layer);⑥、绘制滚动条。-----结束
Android自定义view,我们都知道实现有三部曲,onMeasure(),onLayout(),onDraw()。View的绘制流程是从viewRoot的perfromTraversal方法开始的。它经过measure,layout,draw方法才能够将view绘制出来。其中measure是测量宽高的,layout是确定view在父容器上的摆布位置的,draw是将view绘制到屏幕上的

https://www.php.cn/website-design-ask-457079.html 2/3页面 58下面
view绘制流程

事件分发

View 事件分发一般是指 UI 事件的分发。它本质是递归,递归函数是 dispatchTouchEvent,
当 UI 事件来临时,它首先被分发到 activity,activity 分发给 window,window 再分发给 view 树。分发过程 通过 dispatchTouchEvent 函数完成。它的返回值是 Boolean,如果为 true,表示事件被消费;为 false,表示事件未被消费。 dispatchTouchEvent 在不同的分发阶段有不同的作用

对于 View 而言,它没有子 View,View 自己的 dispatchTouchEvent 实际上会执行到 onTouchEvent 来进行事件的消费

对于 ViewGroup 而言,它重写了 dispatchTouchEvent, 先将事件分发给自己的子 View,
如果子 View 可以消费事件, dispatchTouchEvent 直接返回 true;如果子 View 都不消费事件,就调用自己的 onTouchEvent 来进行事件的消费。

https://juejin.cn/post/6984432840880422949参考地址

图片框架对比

主要的图片框架:Fresco、Glide、Picasso,由于ImageLoader现已不再更新,这里将不再细说

Fresco:
特点:
1、最大的优势便在于5.0以下(最低2.3) bitmap的加载,在5.0以下系统,Fresco将图片放到一个特别的内存区域(Ashmem),而且图片不显示时,占用的内存会自动被释放,这会使APP更加流畅,减少因图片内存占用而引发的OOM。5.0以后的系统默认存储在Ashmem区了

2、图片的渐进式呈现,图片先呈现大致的轮廓,然后随着图片下载的继续,逐渐成仙清晰的图片,这对于慢网络对说,用户体验更好。

3、支持加载Git动态图和Webp格式的图片

缺点:
框架体积比较大,3M左右,会增加APK的大小

Glide:
特点:
1、Glide的with()方法可以接收activity和fragment,图片的加载会和Activity和Fragment的生命周期保持一致,比如Paused暂停加载,Resumed的时候重新加载

2、 图片默认格式为RGB565,而不是ARGB888,内存开销更小,虽然图片的清晰度差些。

3、图片缓存的尺寸是和ImageView一样的,这使得图片加载更快

4、支持加载Git动态图

Picasso:
特点:
1、图片质量高,但加载速度一般,

2、只缓存一个全尺寸的图片

总结:
Picasso能实现的功能,Glide也可以做,但Picasso体积比起Glide小而且如果项目中网络请求用的是OkHttp或者Retrofit(本质还是OkHttp),那么建议用Picasso,体积会小很多。Glide的好处是大型的图片流,比如Git,Vedeo,例如美拍、爱拍这种视频类应用。Fresco在以下的系统内存优化非常好,但代价就是体积大。

还有一款Coil 是一个非常年轻的图片加载库,在 2020 年 10 月 22 日才发布了 1.0.0 版本,也被受到了 Android 官方的推广
特点如下
更快:Coil 在性能上有很多优化,包括内存缓存和磁盘缓存、把缩略图保存在内存中、通过 BitmapPool 循环利用 Bitmap、自动暂停和取消网络请求等
更轻量级:Coil 只有 2000 个方法,跟 Picasso 的方法数差不多,相比 Glide 和 Fresco 要轻量非常多
更容易使用:Coil 的 API 充分利用 Kotlin 的新特性,而且还有丰富的拓展函数,简化和减少了很多样板代码
更流行:Coil 通过 Kotlin 来开发,并且使用包含 Coroutines、okhttp、okio 和 AndroidX Lifecycles 在内的非常多流行的开源库

glide 详细讲解
https://juejin.cn/post/6970683481127043085

RxJava

是一个 基于事件流、实现异步操作的库
3. 特点
由于 RxJava的使用方式是:基于事件流的链式调用,所以使得 RxJava:

逻辑简洁
实现优雅
使用简单
更重要的是,随着程序逻辑的复杂性提高,它依然能够保持简洁 & 优雅。

原理和生活证:顾客到饭店吃饭很类似;
被观察者 (Observable) 通过 订阅(Subscribe) 按顺序发送事件 给观察者 (Observer), 观察者(Observer) 按顺序接收事件 & 作出对应的响应动作

具体说明 4.1开始
https://www.jianshu.com/p/61a2f53d2241

请求框架:

https://www.php.cn/website-design-ask-457079.html 进度滚动到加速器处

混合开发:

目前我们公司,h5sdk,还有银行部分使用到了
方案一借助WebView.addJavascriptInterface实现H5与Native通信,
Native时需要回调,抽离到一个中间的js,为每个任务设置一个业务busID,暂存回调函数,等到Native处理结束后,先走这个中间的js,找到对应的js回调函数执行即可,

方案二WebChromeClien回调接口 下面链接下滑1/2处

方案三:
研发了仿HTML、CSS的解析引擎,引入了Lua脚本运行时。将
HTML标签转换为原生控件,并解析CSS画出纯原生界面,使用开源的Lua脚本运行时执行Lua脚本,为界面添加各种事件和
逻辑。例如

映射成Layout, 映射成ImageView等

方案四,根据html元素坐标绘制 对应的原生控件

https://www.jianshu.com/p/c6346796722f

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值