今天给你们分享一些初中级的面试专题,比较适合在一些中小厂的开发者,跟随我一块儿来看看吧。android
一样,关于下列PDF里全部的知识,绝大部分有配套的视频.代码.源码.资料和笔记,对于我整理的核心PDF笔记感兴趣的
能够点击关于我联系我获取
(VX:mm14525201314)git
(更多完整项目下载。未完待续。源码。图文知识后续上传github。)
内存泄露的根本缘由:长生命周期的对象持有短生命周期的对象。短周期对象就没法及时释放。github
静态内部类非静态内部类的区别(Handler 引发的内存泄漏。)面试
静态集合类引发内存泄露网络
单例模式引发的内存泄漏。mvc
解决:Context是ApplicationContext
,因为ApplicationContext
的生命周期是和app一致的,不会致使内存泄漏app
注册/反注册未成对使用引发的内存泄漏。mvvm
集合对象没有及时清理引发的内存泄漏。一般会把一些对象装入到集合中,当不使用的时候必定要记得及时清理集合,让相关对象再也不被引用。函数
减小内存对象的占用oop
ArrayMap/SparseArray
代替hashmap
Enum
减小bitmap的内存占用
inSampleSize
:缩放比例,在把图片载入内存以前,咱们须要先计算出一个合适的缩放比例,避免没必要要的大图载入。这个问题真的很很差回答。因此这里先来个算是比较恰当的比喻来形容下它们的关系吧。Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图)LayoutInflater
像剪刀,Xml
配置像窗花图纸。
PhoneWindow
。PhoneWindow
有一个“ViewRoot
”,这个“ViewRoot
”是一个View或者说ViewGroup
,是最初始的根视图。ViewRoot
经过addView
方法来一个个的添加View。好比TextView
,Button等WindowManagerService
来接受消息,而且回调Activity函数。好比onClickListener
,onKeyDown
等。因此就有了handler,它的做用就是实现线程之间的通讯。
handler整个流程中,主要有四个对象,handler
,Message
,MessageQueue
,Looper
。当应用建立的时候,就会在主线程中建立handler对象,
咱们经过要传送的消息保存到Message中,handler经过调用sendMessage
方法将Message发送到MessageQueue
中,Looper
对象就会不断的调用loop()方法
不断的从MessageQueue
中取出Message交给handler进行处理。从而实现线程之间的通讯。
ViewGroup
和View
。ViewGroup
包含onInterceptTouchEvent
、dispatchTouchEvent
、onTouchEvent
三个相关事件。View包含dispatchTouchEvent
、onTouchEvent
两个相关事件。其中ViewGroup
又继承于View。2.ViewGroup
和View组成了一个树状结构,根节点为Activity内部包含的一个ViwGroup
。
3.触摸事件由Action_Down、Action_Move、Aciton_UP组成,其中一次完整的触摸事件中,Down和Up都只有一个,Move有若干个,能够为0个。
4.当Acitivty
接收到Touch事件时,将遍历子View进行Down事件的分发。ViewGroup
的遍历能够当作是递归的。分发的目的是为了找到真正要处理本次完整触摸事件的View,这个View会在onTouchuEvent
结果返回true。
5.当某个子View返回true时,会停止Down事件的分发,同时在ViewGroup
中记录该子View。接下去的Move和Up事件将由该子View直接进行处理。
因为子View是保存在ViewGroup
中的,多层ViewGroup
的节点结构时,上级ViewGroup
保存的会是真实处理事件的View所在的ViewGroup
对象:如ViewGroup0-ViewGroup1-TextView
的结构中,TextView
返回了true,它将被保存在ViewGroup1
中,而ViewGroup1
也会返回true,被保存在ViewGroup0
中。当Move和UP事件来时,会先从ViewGroup0
传递至ViewGroup1
,再由ViewGroup1
传递至TextView
。
6.当ViewGroup
中全部子View都不捕获Down事件时,将触发ViewGroup
自身的onTouch
事件。触发的方式是调用super.dispatchTouchEvent
函数,即父类View的dispatchTouchEvent
方法。在全部子View都不处理的状况下,触发Acitivity
的onTouchEvent
方法。
7.onInterceptTouchEvent
有两个做用:1.拦截Down事件的分发。2.停止Up和Move事件向目标View传递,使得目标View所在的ViewGroup
捕获Up和Move事件。
MCP.MVVM项目实战代码.笔记
1.mvc:数据、View、Activity,View将操做反馈给Activity,Activitiy去获取数据,数据经过观察者模式刷新给View。循环依赖Activity,很难单元测试View和Model耦合严重
2.mvp:数据、View、Presenter,View将操做给Presenter,Presenter去获取数据,数据获取好了返回给Presenter,Presenter去刷新View。PV,PM双向依赖
3.mvvm:数据、View、ViewModel,View将操做给ViewModel,ViewModel去获取数据,数据和界面绑定了,数据更新界面更新。
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);⑥、绘制滚动条。
P 消耗内存小
网络传输用S 程序内使用P
S将数据持久化方便
S使用了反射 容易触发垃圾回收 比较慢