0%

MVVM项目结构整理

基于Kotlin/Dagger2/RxJava/RxAndroid/Retrofit/Okhttp/ViewModel/LiveData等来实现

  1. 框架结构整理

MVVM – Model View ViewModel 的方式来实现

a.MVC/MVP/MVVM项目结构的区别

  1. 相关代码整理
Read more »

Android View的绘制流程

View相关
1.View树的绘制流程
考点:

绘制的大致流程
requestLayout和invalidate区别
measure核心的两个类
layout的核心方法
绘制的5大步骤
参考答案:

绘制大致流程:
activity接收到焦点,就开始请求绘制布局,入口是ViewRoot的performTraversal()函数,判断是否需要重新measure、layout、draw(测量、摆放、绘制)
requestLayout和invalidate区别:
invalidate()请求重绘View树,即draw过程,假如视图发生大小没有变化就不会调用layout()过程,并且只绘制那些调用了invalidate()方法的 View。
requestLayout()当布局变化的时候,比如方向变化,尺寸的变化,会调用该方法,在自定义的视图中,如果某些情况下希望重新测量尺寸大小,应该手动去调用该方法,它会触发measure()和layout()过程,但不会进行draw
measure核心的两个类:LayoutParams(View自身的布局参数)、MeasureSpecs(父视图对子视图对测量要求)
LayoutParams注意可能的强制类型转换错误
MeasureSpecs有UNSPECIFIED、EXACTLY、AT_MOST(不约束、精确约束、限定最大尺寸)三种模式
子视图的具体位置都是相对于父视图而言的,View的onLayout方法为空实现。
draw的五大步骤:背景(background.draw(canvas))、自身(onDraw)、子视图(dispatchDraw)、装饰(onDrawScrollBars)
2.View的事件分发机制
点击事件产生后,首先传递给 Activity 的 dispatchTouchEvent 方法,通过 PhoneWindow 传递给 DecorView,然后再传递给根 ViewGroup,进入 ViewGroup 的 dispatchTouchEvent 方法,执行 onInterceptTouchEvent 方法判断是否拦截,再不 拦截的情况下,此时会遍历 ViewGroup 的子元素,进入子 View 的 dispatchToucnEvent 方法,如果子 view 设置了 onTouchListener,就执行 onTouch 方法,并根据 onTouch 的返回值为 true 还是 false 来决定是否执行 onTouchEvent 方法,如果是 false 则继续执行 onTouchEvent,在 onTouchEvent 的 Action Up 事件中判断,如果设置了 onClickListener,就执行 onClick 方法。

Read more »

FragmentPagerAdapter和FragmentStatePagerAdapter区别

ViewPager
ViewPager 如其名所述,是负责翻页的一个 View。准确说是一个 ViewGroup,包含多个 View 页,在手指横向滑动屏幕时,其负责对 View 进行切换。为了生成这些 View 页,需要提供一个 PagerAdapter 来进行和数据绑定以及生成最终的 View 页。

Read more »

RecyclerView 优化
  1. 数据处理和视图加载分离;
  2. 数据优化:
    a.分页获取远端数据
    b.对远端数据进行缓存,提升二次加载的速度
    c.对于新增或者删除数据使用DiffUtil来进行局部刷新,而不是一味地全局刷新数据
  3. 布局优化
    a.减少过渡绘制
    b.减少xml文件inflate的时间
    c.减少View对象的创建
Read more »