Android开发中,事情分发是一个至关重要的概念,它关乎用户体会的流畅性和运用程序的呼应功能。在面试中,关于Android事情分发的问题通常是归于高档难度的,需求面试者对Android体系的事情分发机制有深化的了解和实践经历。

但是,在调查Android事情分发机制时,许多求职者依然会犯一些常见的错误,比如:

  • 对事情分发流程了解不明晰,无法完整地描绘各个环节。
  • 无法深化剖析事情阻拦机制,导致无法处理滑动抵触等问题。
  • 缺乏对源码的了解,无法解说事情分发的底层完成原理。

为了协助求职者更好地把握Android事情分发机制,我将共享一些面试技巧,并深化探讨一些高档疑难问题。

事情分发的三大阶段

问题: 请具体描绘接触事情的三大阶段以及每个阶段的关键办法。

起点: 调查求职者对事情分发流程的整体了解。

参阅简答:

接触事情的三大阶段:

  1. 事情传递阶段: 从Activity到Window再到ViewGroup,终究传递到具体的View实例。关键办法:
    • Activity.dispatchTouchEvent()
    • Window.superDispatchTouchEvent()
    • ViewGroup.dispatchTouchEvent()
    • View.dispatchTouchEvent()
  2. 事情阻拦阶段: 判定是否要阻拦事情,并阻挠事情持续传递。关键办法:
    • ViewGroup.onInterceptTouchEvent()
  3. 事情处理阶段: 消费事情并做出呼应。关键办法:
    • View.onTouchEvent()

三个办法的联系用伪代码表明如下:

public boolean dispatchTouchEvent(MotionEvent ev) {
    boolean consume = false;
    if (onInterceptTouchEvent(ev)) {
        consume = onTouchEvent(ev);
    } else {
        coonsume = child.dispatchTouchEvent(ev);
    }
    return consume;
}

事情传递流程

问题: 请具体阐明View的事情分发机制,包含事情的传递进程和ViewGroup的效果。

起点: 在答复这个问题时,需求对View的事情传递、事情阻拦和事情处理进程有明晰的认识,以及了解ViewGroup在事情分发中的效果。

参阅简答:

打破面试瓶颈!限时共享Android面试中事情分发的高档技巧

View的事情分发机制包含三个关键步骤:事情分发、事情阻拦和事情处理。 1.事情分发:当用户接触屏幕时,事情首要由顶层的Activity开始分发,然后逐级传递给方针ViewGroup,直到找到处理该事情的View停止。 2.事情阻拦:在事情分发进程中,假如某个ViewGroup阻拦了事情,则该事情将不再向下传递给子View,而是由ViewGroup自己处理或分发给父View。 3.事情处理:当事情到达方针View时,该View会调用自身的事情处理办法(例如onTouchEvent)来处理事情,假如事情被处理,则事情分发结束;假如事情未被处理,则事情会向上回来,由父View持续处理。

MotionEvent原理

问题: 请解说MotionEvent在Android中的效果和原理,并阐明它与事情分发的联系。

起点: 在答复这个问题时,需求考虑MotionEvent在接触事情中的效果、怎么获取和处理MotionEvent、MotionEvent的事情类型等方面。

参阅简答:

  • MotionEvent是Android中用于描绘接触事情的类,它封装了与接触相关的信息,包含接触点的方位、事情的时刻戳、事情的类型等。
  • MotionEvent的原理是经过底层的接触屏驱动获取用户的接触操作,并将这些操作转换为Android体系可以了解的事情。
  • MotionEvent与事情分发的联系在于,当用户接触屏幕时,Android体系会将接触事情封装成MotionEvent目标,并经过事情分发机制传递给相应的View进行处理。

问题: 请比较MotionEvent和GestureDetector的差异,并阐明它们在事情处理中的运用场景。

起点: 在答复这个问题时,需求对MotionEvent和GestureDetector的效果、原理和运用场景有明晰的认识。

参阅简答:

  • MotionEvent是Android中用于描绘接触事情的类,它封装了与接触相关的信息,如接触点的方位、事情的时刻戳等。
  • GestureDetector是Android中用于手势辨认的类,它封装了常见手势的辨认逻辑,如单击、双击、长按等。
  • 差异在于MotionEvent是原始的接触事情,而GestureDetector是对接触事情的高档抽象和封装,供给了更快捷的手势辨认功能。
  • 在事情处理中,假如需求辨认杂乱的手势操作,可以运用GestureDetector来完成;假如只需求处理简略的接触事情,可以直接运用MotionEvent

事情抵触处理计划

问题: 请剖析在嵌套运用时可能产生的滑动抵触,并给出处理计划。

起点: 调查求职者对事情阻拦机制的深化了解和处理滑动抵触的才能。

参阅简答:

滑动抵触的原因:

  • 嵌套滑动view都想要阻拦滑动事情,导致事情抵触。
  • 常见的滑动抵触场景包含ScrollView嵌套RecyclerViewViewPager嵌套RecyclerView等。

抵触处理规则:

  • 关于外部滑动与内部滑动方向不一致产生的滑动抵触,经过判断滑动方历来决议哪个view进行阻拦
  • 关于外部滑动与内部滑动方向一致产生的滑动抵触,经过滑动到特别的方位进行决议哪个view进行阻拦

处理滑动抵触的常见计划包含但不限于:运用NestedScrolling机制、重写onInterceptTouchEvent办法、设置滑动方向等。但总得来说可以归为两类。

  • 外部阻拦:事情交由父view去处理,重写外部父布局的onInterceptTouchEvent办法,根据条件判断什么时候进行阻拦
  • 内部阻拦:事情交由子view去处理,重写内部子view的dispatchTouchEvent办法或许onTouchEvent办法,假如内部view需求该事情就直接消费,不需求就交给父view进行处理,需求结合父view的requestDisallowTouchEvent办法运用。

针对点击抵触则通常产生在多个可点击View堆叠的情况下,处理方式包含:设置点击事情的优先级、调整View的层级联系、或许经过事情阻拦等方式来处理。

干扰器的效果原理与规模

问题: requestDisallowInterceptTouchEvent能否干扰down事情?

起点: 调查requestDisallowInterceptTouchEvent办法的效果规模。

具体简答: requestDisallowInterceptTouchEvent办法的主要效果是恳求父View在之后的接触事情序列中不要阻拦特定的接触事情。但是,它并不会直接影响down事情的传递。

在事情分发机制中,down事情是最早产生的接触事情,它会直接传递给方针View,并触发父View的接触事情阻拦逻辑。因此,即使子View调用了requestDisallowInterceptTouchEvent(true),父View仍有机会在down事情中决议是否阻拦接触事情,因为在触发down事情的时候会重置影响的flag。

但是,requestDisallowInterceptTouchEvent办法可以影响之后的接触事情序列,特别是在down事情之后的move、up等事情中。假如在down事情之后,子View调用了requestDisallowInterceptTouchEvent(true),父View就会在接下来的move、up等事情中不再阻拦接触事情,从而保证子View可以顺畅地处理这些事情。

总的来说,尽管requestDisallowInterceptTouchEvent办法自身不会直接干扰down事情的传递,但它会影响之后的接触事情序列,保证子View可以顺畅地处理接下来的接触事情。

事情传递的优先级

问题: View中dispatchTouchEvent的事情传递的优先级是怎样的?

起点: 可以从onTouch、onTouchEvent与onClick事情的传递优先级下手。

参阅简答:

  1. onTouchListener.onTouch: onTouch() 办法,用于处理接触事情。当一个View设置了OnTouchListener,它的onTouch办法会在接触事情产生时首要被调用。onTouch办法可以回来true表明事情已被处理,回来false则表明事情未被处理,将持续传递给onTouchEvent办法。

  2. onTouchEvent: onTouchEvent 办法是 View 类中的一个办法,用于处理接触事情。当没有设置 OnTouchListener,或许OnTouchListeneronTouch办法回来false时,体系会调用View的onTouchEvent办法来处理接触事情。在onTouchEvent办法中,View可以对接触事情进行处理,并回来true表明事情已被消费,回来false表明事情未被消费,将持续传递给父View或许处理点击事情。

  3. onClickListener.onClick: onClick() 办法,用于处理点击事情。当用户点击一个可点击的View,而且onTouch()没有被阻拦,体系会调用该View的onClick办法来处理点击事情。与接触事情不同,点击事情不会影响接触事情的传递顺序,因此onClick办法在接触事情产生后被调用。

所以,事情传递的优先级是onTouch > onTouchEvent > onClick

事情分发的功能优化

问题: 请提出一些优化事情分发功能的战略。

起点: 调查面试者对事情分发功能优化的了解。

参阅简答:

  • 削减View层级:尽量削减View的嵌套层级,避免过深的View结构。
  • 削减事情消费链长度:合理运用事情阻拦和处理,尽量削减事情传递的层级。
  • 合理运用事情缓存:在杂乱的布局中,可以经过缓存事情的方式来削减事情分发的时刻。
  • 避免不必要的事情监听:及时移除不再需求的事情监听,避免产生无效的事情分发。
  • 削减主线程耗时操作:避免在事情处理阶段进行耗时操作。

结语

以上是关于Android事情分发面试技巧的一些高档问题和具体解答,希望可以对面试者有所协助。在面试进程中,除了理论知识外,关于事情分发的实践运用经历也是面试者需求要点预备和展现的部分。至此,预祝大家成功。

推荐

android_startup: 供给一种在运用启动时可以更加简略、高效的方式来初始化组件,优化启动速度。不仅支撑Jetpack App Startup的悉数功能,还供给额外的同步与异步等待、线程操控与多进程支撑等功能。

AwesomeGithub: 根据Github的客户端,纯操练项目,支撑组件化开发,支撑账户暗码与认证登陆。运用Kotlin言语进行开发,项目架构是根据JetPack&DataBinding的MVVM;项目中运用了Arouter、Retrofit、Coroutine、Glide、Dagger与Hilt等盛行开源技术。

flutter_github: 根据Flutter的跨平台版本Github客户端,与AwesomeGithub相对应。

android-api-analysis: 结合具体的Demo来全面解析Android相关的知识点, 协助读者可以更快的把握与了解所阐述的要点。

daily_algorithm: 每日一算法,由浅入深,欢迎参加一同共勉。