Android面试精华:Handler、线程与IO操作详解

版权申诉
0 下载量 146 浏览量 更新于2024-08-19 收藏 201KB PDF 举报
Android常见原理性面试专题深入探讨了Android系统的核心组件和设计模式,旨在帮助面试者理解Android开发中关键概念的实现原理和应用场景。以下是主要内容的详细解读: 1. **Handler机制和底层实现**: Handler是Android中用于线程间通信的关键组件,它允许在主线程之外的子线程执行UI操作。Handler通过Looper对象与消息队列关联,消息队列负责管理接收到的消息并分发给相应的Handler实例。当我们在子线程中创建Handler实例时,其handleMessage()方法会在子线程中执行,确保UI更新的同步性。 2. **Handler、Thread和HandlerThread的区别**: - **Thread** 是基础的线程类型,没有内置的消息处理机制,需要手动创建Looper来管理消息队列。 - **HandlerThread** 是一个特殊的Thread,内部已包含Looper,方便在其中创建Handler实例,适用于本地IO操作,如数据库或文件访问,因为它能保持较低的阻塞。 - Handler发送消息给子线程时,通常是通过调用Handler.sendEmptyMessageDelayed()等方法,这些方法会将消息放入Looper的消息队列等待处理。 3. **ThreadLocal原理和使用**: ThreadLocal是一种线程局部变量存储机制,每个线程都有一份自己的副本,可以避免数据竞争问题。创建ThreadLocal变量时,会自动在当前线程中设置值。保证线程局部性是通过ThreadLocal类提供的get()和set()方法实现的。 4. **Message、Handler、MessageQueue和Looper的关系**: 在单线程模型中,MessageQueue是Looper的核心,它是线程的消息队列,用于存放和分发消息。Handler负责从MessageQueue中取出消息并处理,通常在消息队列为空时进入休眠。每当有新的消息到来,Looper会唤醒Handler,使其执行handleMessage()方法。 5. **View事件传递机制**: View的事件传递遵循从根视图到子视图的顺序,直到找到能处理特定事件的View为止。View的事件分发主要包括onTouchEvent()、onInterceptTouchEvent()和onTouch()三个方法。onTouchEvent()是ViewGroup的默认事件处理器,子View通过调用父ViewGroup的onTouchEvent()来传递事件;onInterceptTouchEvent()则用于拦截事件,防止事件继续传递到其他子View;onTouch()则是视图层级中处理触摸事件的实际位置。 6. **Touch事件传递流程**: 触摸事件首先由窗口管理器捕获,然后逐层传递给View树,当事件到达View时,View会根据自身的点击区域、焦点状态和手势识别判断是否处理该事件,最终由最上层的View或者ViewGroup的onTouchEvent()方法处理。 7. **onTouch和onTouchEvent的区别**: onTouch()是Android 3.0引入的,用于处理点击、长按等特定类型的触摸事件,而onTouchEvent()是通用的触摸事件处理器,包括滑动、触摸屏点击等。onTouch()方法的参数更明确,适合处理特定事件,onTouchEvent()则提供更全面的事件信息。 8. **View和ViewGroup的事件分发**: View直接处理自己的触摸事件,而ViewGroup则在其子View之间进行事件分发,可以控制子View的可见性和交互行为。在ViewGroup中,子View的事件分发遵循从上至下的原则,直到找到合适的View为止。 掌握以上知识点,可以帮助面试者深入理解Android系统内部的工作原理,提升在面试中解答相关问题的能力。

# -*- coding: UTF-8 -*- from lib2to3.pgen2 import driver from appium import webdriver from appium.webdriver.common.appiumby import AppiumBy el1 = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="通讯录") el1.click() el2 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.ListView/android.widget.FrameLayout[3]/android.widget.RelativeLayout") el2.click() el3 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[1]/android.widget.TextView") el3.click() el4 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[8]") el4.click() el5 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[11]") el5.click()

2023-06-08 上传