如果你在中小厂,这些你一定要搞懂,分享一些行业经验
避免在 android 里面使用
Enum
减少 bitmap 的内存占用
inSampleSize
:缩放比例,在把图片载入内存之前,我们需要先计算出一个合适的缩放比例,避免不必要的大图载入。decode format:解码格式,选择 ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差异。
减少资源图片的大小,过大的图片可以考虑分段加载
2、理解 Activity,View,Window 三者关系
这个问题真的很不好回答。所以这里先来个算是比较恰当的比喻来形容下它们的关系吧。Activity 像一个工匠(控制单元),Window 像窗户(承载模型),View 像窗花(显示视图)LayoutInflater
像剪刀,Xml
配置像窗花图纸。
Activity 构造的时候会初始化一个 Window,准确的说是
PhoneWindow
。这个
PhoneWindow
有一个“ViewRoot
”,这个“ViewRoot
”是一个 View 或者说ViewGroup
,是最初始的根视图。ViewRoot
通过addView
方法来一个个的添加 View。比如TextView
,Button 等这些 View 的事件监听,是由
WindowManagerService
来接受消息,并且回调 Activity 函数。比如onClickListener
,onKeyDown
等。
3、Handler 的原理
所以就有了 handler,它的作用就是实现线程之间的通信。
handler 整个流程中,主要有四个对象,handler
,Message
,MessageQueue
,Looper
。当应用创建的时候,就会在主线程中创建 handler 对象,
我们通过要传送的消息保存到 Message 中,handler 通过调用sendMessage
方法将 Message 发送到MessageQueue
中,Looper
对象就会不断的调用 loop()方法
不断的从MessageQueue
中取出 Message 交给 handler 进行处理。从而实现线程之间的通信。
4、View,ViewGroup 事件分发
Touch 事件分发中只有两个主角:
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 事件。
5、onNewIntent()什么时候调用?(singleTask)
6、mvc?和?mvp mvvm
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 去获取数据,数据和界面绑定了,数据更新界面更新。
viewModel 的业务逻辑可以单独拿来测试
一个 view?对应一个?viewModel?业务逻辑可以分离,不会出现全能类
数据和界面绑定了,不用写垃圾代码,但是复用起来不舒服
7、自定义控件
View 的绘制流程:OnMeasure()——>OnLayout()——>OnDraw()
评论