写点什么

我的十年:2020 金九银十必刷——小米

用户头像
Android架构
关注
发布于: 5 小时前

引申:两者都只能对 view 内容进行滑动,而不能使 view 本身滑动,且非平滑,可使用 Scroller 有过渡滑动的效果


Q:Scroller 中最重要的两个方法是什么?主要目的是?


技术点:View 滑动


思路:从 Scroller 实现滑动的具体过程出发,


参考回答:Scroller 实现滑动的具体过程:


  • 在 MotionEvent.ACTION_UP 事件触发时调用 startScroll()方法,该方法并没有进行实际的滑动操作,而是记录滑动相关量

  • 马上调用 invalidate/postInvalidate()方法,请求 View 重绘,导致 View.draw 方法被执行

  • 紧接着会调用 View.computeScroll()方法,此方法是空实现,需要自己处理逻辑。具体逻辑是:先判断 computeScrollOffset(),若为 true(表示滚动未结束),则执行 scrollTo()方法,它会再次调用 postInvalidate(),如此反复执行,直到返回值为 false。流程图如下:



其中,最重要的两个方法是 startScroll()和 computeScroll()


Q:谈一谈 View 的事件分发机制?


技术点:View 事件分发


思路:从分发本质、传递顺序、核心方法展开


参考回答:


事件分发本质:就是对 MotionEvent 事件分发的过程。即当一个 MotionEvent 产生了以后,系统需要将这个点击事件传递到一个具体的 View 上。


点击事件的传递顺序:Activity(Window) -> ViewGroup -> View


三个主要方法:


  • dispatchTouchEvent:进行事件的分发(传递)。返回值是 boolean 类型,受当前 onTouchEvent 和下级 view 的 dispatchTouchEvent 影响

  • onInterceptTouchEvent:对事件进行拦截。该方法只在 ViewGroup 中有,View(不包含 ViewGroup)是没有的。一旦拦截,则执行 ViewGroup 的 onTouchEvent,在 ViewGroup 中处理事件,而不接着分发给 View。且只调用一次,所以后面的事件都会交给 ViewGroup 处理。

  • onTouchEvent:进行事件处理。


Q:如何解决 View 的滑动冲突?


技术点:View 滑动冲突


思路:从处理规则和具体实现方法展开讨论


参考回答:


(1)处理规则:


  • 对于由于外部滑动和内部滑动方向不一致导致的滑动冲突,可以根据滑动的方向判断谁来拦截事件。

  • 对于由于外部滑动方向和内部滑动方向一致导致的滑动冲突,可以根据业务需求,规定何时让外部 View 拦截事件何时由内部 View 拦截事件。

  • 对于上面两种情况的嵌套,相对复杂,可同样根据需求在业务上找到突破点。


(2)实现方法:


  • **外部拦截法:**指点击事件都先经过父容器的拦截处理,如果父容器需要此事件就拦截,否则就不拦截。具体方法:需要重写父容器的 onInterceptTouchEvent 方法,在内部做出相应的拦截。

  • **内部拦截法:**指父容器不拦截任何事件,而将所有的事件都传递给子容器,如果子容器需要此事件就直接消耗,否则就交由父容器进行处理。具体方法:需要配合 requestDisallowInterceptTouchEvent 方法。


Q:谈一谈 View 的工作原理?


技术点:View 工作流程


思路:围绕三大流程展开


参考回答:View 工作流程简单来说就是,先 measure 测量,用于确定 View 的测量宽高,再 layout 布局,用于确定 View 的最终宽高和四个顶点的位置,最后 draw 绘制,用于将 View 绘制到屏幕上。具体过程图见:



ViewRoot 对应于 ViewRootImpl 类,它是连接 WindowManager 和 DecorView 的纽带。


View 的绘制流程是从 ViewRoot 和 performTraversals 开始。


performTraversals()依次调用 performMeasure()、performLayout()和 performDraw()三个方法,分别完成顶级 View 的绘制。


其中,performMeasure()会调用 measure(),measure()中又调用 onMeasure(),实现对其所有子元素的 measure 过程,这样就完成了一次 measure 过程;接着子元素会重复父容器的 measure 过程,如此反复至完成整个 View 树的遍历。layout 和 draw 同理。


Q:MeasureSpec 是什么?有什么作用?


技术点:View 工作流程(measure)


思路:从 MeasureSpec 作用、组成、模式和决定因素展开


参考回答:


**作用:**通过宽测量值 widthMeasureSpec 和高测量值 heightMeasureSpec 决定 View 的大小


**组成:**一个 32 位 int 值,高 2 位代表 SpecMode(测量模式),低 30 位代表 SpecSize( 某种测量模式下的规格大小)。


三种模式:


  • UNSPECIFIED:父容器不对 View 有任何限制,要多大有多大。常用于系统内部。

  • EXACTLY(精确模式):父视图为子视图指定一个确切的尺寸 SpecSize。对应 LyaoutParams 中的 match_parent 或具体数值。

  • AT_MOST(最大模式):父容器为子视图指定一个最大尺寸 SpecSize,View 的大小不能大于这个值。对应 LayoutParams 中的 wrap_content。


**决定因素:**值由子 View 的布局参数 LayoutParams 和父容器的 MeasureSpec 值共同决定。具体规则见下图:



引申:直接继承 View 的自定义 View 需要重写 onMeasure()并设置 wrap_content 时的自身大小,否则效果相当于 macth_parent。




二、京东

2013/7/20 日——2015/6/20 日。我记得京东的面试还是很专业的,算上 HR 面总共经历了 5 轮,第一轮的面试官应该是做后台 Java 开发的,问的主要是 Java 基础。二面应该是部门内的同事,问的内容是 Android 基础,问的面很全,几乎什么都会问到,第三轮是部门 Leader,问的内容就比较深了,涉及到的源码和 frameWork 层的东西就比较多了,第四轮是大部门负责人,不会问技术了,就是聊聊大方向,最后一轮是 HR,大公司的 HR 都有一票否决权。


1.面试题精华及其答案


Q:自定义 View/ViewGroup 需要注意什么?


技术点:自定义 View


参考回答:



Q:onTouch()、onTouchEvent()和 onClick()关系?


技术点:View 事件分发


参考回答:优先度 onTouch()>onTouchEvent()>onClick()。因此 onTouchListener 的 onTouch()方法会先触发;如果 onTouch()返回 false 才会接着触发 onTouchEvent(),同样的,内置诸如 onClick()事件的实现等等都基于 onTouchEvent();如果 onTouch()返回 true,这些事件将不会被触发。


引申:OnTouchListener、OnClickListener 的冲突


Q:SurfaceView 和 View 的区别?


技术点:View、SurfaceView


参考回答:SurfaceView 是从 View 基类中派生出来的显示类,他和 View 的区别有:


  • View 需要在 UI 线程对画面进行刷新,而 SurfaceView 可在子线程进行页面的刷新

  • View 适用于主动更新的情况,而 SurfaceView 适用于被动更新,如频繁刷新,这是因为如果使用 View 频繁刷新会阻塞主线程,导致界面卡顿

  • SurfaceView 在底层已实现双缓冲机制,而 View 没有,因此 SurfaceView 更适用于需要频繁刷新、刷新时数据处理量很大的页面


Q:invalidate()和 postInvalidate()的区别?


技术点:View 刷新


参考回答:invalidate()与 postInvalidate()都用于刷新 View,主要区别是 invalidate()在主线程中调用,若在子线程中使用需要配合 handler;而 postInvalidate()可在子线程中直接调用。


Q:Android 中还了解哪些方便线程切换的类?


技术点:线程通信


参考回答:对 Handler 进一步的封装的几个类:


  • AsyncTask:底层封装了线程池和 Handler,便于执行后台任务以及在子线程中进行 UI 操作。

  • HandlerThread:一种具有消息循环的线程,其内部可使用 Handler。

  • IntentService:是一种异步、会自动停止的服务,内部采用 HandlerThread。


引申:更多是对消息机制的理解


Q:AsyncTask 相比 Handler 有什么优点?不足呢?


技术点:AsyncTask、Handler


参考回答:


Handler 机制存在的问题:多任务同时执行时不易精确控制线程。


引入 AsyncTask 的好处:创建异步任务更简单,直接继承它可方便实现后台异步任务的执行和进度的回调更新 UI,而无需编写任务线程和 Handler 实例就能完成相同的任务。


Q:使用 AsyncTask 需要注意什么?


技术点:AsyncTask


参考回答:


  • 不要直接调用 onPreExecute()、doInBackground()、onProgressUpdate()、onPostExecute()和 onCancelled()方法

  • 一个异步对象只能调


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


用一次 execute()方法


引申:谈谈 AsyncTask 初始化、五个核心方法如何配合进而体现 Handler 的作用


Q:AsyncTask 中使用的线程池大小?


技术点:AsyncTask


参考回答:在 AsyncTask 内部实现有两个线程池:


  • SerialExecutor:用于任务的排队,默认是串行的线程池,在 3.0 以前核心线程数为 5、线程池大小为 128,而 3.0 以后变为同一时间只能处理一个任务

  • THREAD_POOL_EXECUTOR:用于真正执行任务。


引申:谈谈对线程池的理解


Q:HandlerThread 有什么特点?


技术点:HandlerThread

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
我的十年:2020金九银十必刷——小米