Android常见原理性面试专题
【Android原理性面试专题】 1. **Handler机制与底层实现** Handler是Android中用于线程间通信的关键组件。它负责发送和处理Message对象。在Android系统中,每个线程都有一个消息队列(Message Queue)和一个Looper,Looper不断地从消息队列中取出消息并交给对应的Handler进行处理。当在主线程中创建一个Handler实例时,它默认关联到主线程的Looper,而在子线程中,需要先创建Looper,才能使用Handler。 2. **Handler、Thread和HandlerThread的区别** - Handler:主要作用是发送和处理Message,它与特定的线程(通常为主线程)绑定。 - Thread:普通线程,若需要处理消息,需要手动创建Looper并启动循环。 - HandlerThread:预封装了Looper的线程,启动后自动运行Looper,方便在子线程中处理消息。调用quit()或quitSafely()方法可安全退出HandlerThread的循环。 3. **ThreadLocal原理** ThreadLocal是线程局部变量,它为每个线程创建了一个独立的变量副本,每个线程只能访问自己的副本,互不影响。这样实现了线程间的隔离,确保了数据的安全性。 4. **Message、Handler、Message Queue、Looper的关系** Message是消息对象,存放需要传递的数据;Handler是消息处理器,负责发送和处理消息;Message Queue是消息队列,存储待处理的消息;Looper负责从消息队列中取出消息,然后通过Handler进行处理。 5. **View事件传递分发机制** 触摸事件的传递遵循“事件冒泡”规则,从最深的View开始,逐级向上层View传递,直到被消费或者到达根View。onTouchEvent()和onTouchEvent()是两个关键的事件处理方法,前者在ViewGroup中处理,后者在View中处理。可以通过返回值控制事件是否继续向上冒泡。 6. **View刷新机制** 当View的状态发生改变,需要重新绘制时,会触发View的invalidate()或postInvalidate()方法,这些方法会将View添加到待绘制队列中,然后由Android系统的 Choreographer 组件调度在合适的时机执行draw()方法进行重绘。 7. **自定义控件原理** 自定义View主要涉及重写onDraw()方法进行绘制,以及可能需要覆盖的其他方法如onMeasure()来确定尺寸,onLayout()来布局。为了暴露属性,可以使用attrs.xml定义自定义属性,然后在构造函数中解析并保存,最后通过getters和setters对外提供接口。 8. **Android联网WAP方式** Android中实现WAP联网,通常使用HttpURLConnection或HttpClient等网络库进行HTTP请求。配置网络权限并在代码中构建URL,发起GET或POST请求,然后读取响应数据。 9. **AsyncTask机制** AsyncTask是一个轻量级的后台任务执行框架,用于在UI线程和后台线程之间交互。它提供了简单的接口,包括onPreExecute()、doInBackground()、onProgressUpdate()和onPostExecute()等方法,使得开发者可以方便地执行异步操作并更新UI。 10. **避免ANR(Application Not Responding)** ANR是由于主线程被长时间阻塞,无法响应用户输入或系统消息而产生的。避免ANR的方法包括:避免在主线程进行耗时操作,使用异步任务处理耗时工作,及时关闭Cursor,以及合理使用Handler。 11. **防止OOM(内存溢出)** OOM是由于内存分配超出系统可用内存而导致的异常。防止OOM的方法包括:合理使用Bitmap,及时释放资源,避免内存泄漏,以及限制单个Activity的内存占用。 12. **内存泄漏及其原因** 内存泄漏是指不再使用的对象仍然被其他对象引用,导致GC无法回收。常见的内存泄漏原因包括:静态变量引用非静态对象,忘记取消注册BroadcastReceiver,以及Handler对象的内存泄漏。 13. **解决内存泄漏的方法** 解决内存泄漏可以采取以下措施:避免静态引用非静态对象,使用弱引用(如WeakReference)引用外部类,正确释放资源,及时取消注册监听器,以及避免在非静态内部类中使用this引用。 以上是Android面试中常见的原理性问题,理解并掌握这些知识点对提升Android开发技能和应对面试至关重要。
下载地址
用户评论