推荐相关面试文章
盘点2021年Android——面试必备基础技能 - 个人文章 - SegmentFault 思否
1.View绘制流程
View的整个绘制流程可以分为以下三个阶段:measure测量->layout布局->draw绘制
- onMeasure()确定View的测量宽高
- onLayout()确定View的最终宽高和四个顶点的位置
- onDraw()将View 绘制到屏幕上
Android面试:Invalidate、RequestLayout_requestlayout和invalidate_沙漠一只雕得儿得儿的博客-CSDN博客
Android自定义View中invalidate重绘和requestLayout更新 - 行业资讯 - 电子产品设计开发与电子技术学习交流!
2.事件分发机制
事件传递的顺序:Activity->Window->DecorView->ViewGroup->View。
事件分发机制主要由事件分发(dispatchTouchEvent)->事件拦截(onInterceptTouchEvent)->事件处理(onTouchEvent)三步来进行逻辑控制。
3.滑动冲突如何解决
举例:ViewPager2嵌套垂直滑动的Fragment,Fragment布局中有一个RecyclerView消息列表。RececlerView上下滑动会与ViewPager2产生冲突,解决办法:自定义一个继承RecyclerView的类,在dispatchTouchEvent方法中调用getParent().requestDisallowInterceptTouchEvent(true) (true父控件不会拦截事件)
4.性能优化(内存泄漏,内存溢出OOM,ANR)
1.内存泄漏(概念:内存泄漏即该被释放的内存没有被及时的释放,一直被某个或某些实例所持有却不再使用导致GC不能回收。) (会问内存泄漏有哪些例子)
A.、Handler内存泄漏的原因是什么?如何解决?
在Activity或Fragment销毁时,Handler中可能还有未处理的Message或Runnable,持有Handler的引用,导致Handler无法被回收,从而引发内存泄漏。
解决办法:
- 在Activity或Fragment的onDestroy()方法中,调用Handler的removeCallbacksAndMessages()方法(移除所有的Message和Runnable)。
- 使用弱引用或WeakReference代替强引用来引用Handler。
B、单例导致内存泄漏的原因是什么?如何解决?
列如:单例实例持有Activity的Context,此时单例就有持有该 Activity 的强引用(直到整个应用生命周期结束)。即使该 Activity 退出,该 Activity 的内存也不会被回收,这样就造成了内存泄露。
解决办法:
将 Context改成context.getApplicationContext() ,此时单例引用的对象是 Application,而 Application 的生命周期本来就跟应用程序是一样的,也就不存在内存泄露。
C、内部类导致内存泄漏 Android常见内存泄漏_android常见的内存泄漏_打架不行的二哈的博客-CSDN博客
非静态内部类会默认持有外部类的引用。会导致内部类的生命周期过长。
正确的做法就是修改成静态内部类。D、线程造成的内存泄漏
Android造成OOM 和ANR的原因及解决办法 - 简书
如果Activity在销毁之前,任务还未完成, 那么将导致Activity的内存资源无法回收,造成内存泄漏。
2.内存溢出OOM 当对象的内存占用已经超出分配内存的空间大小
大致分为两类:
⑴,加载对象过大;
举例:
1.加载加载Bitmap之前先计算出合适的缩放比例
⑵,相应资源过多,没有来不及释放。
3.ANR(应用程序无响应) 只有主线程才会产生ANR,主线程就是UI线程
举例:
1.5秒内无法响应屏幕触摸事件或键盘输入事件。
2.前台广播(BroadcastReceiver)的
onReceive()
函数时10秒没有处理完成,后台为60秒。3.前台服务20秒内,后台服务在200秒内没有执行完毕。
如何避免ANR的发生:
1.避免在主线程执行耗时操作,耗时操作应新开一个子线程完成,然后在主线程更新UI。
2.BroadcastReceiver要执行耗时操作时应启动一个service,将耗时操作交给service来完成。
5.Handler相关知识
Handler是用于实现线程间通信和任务调度的一种机(
Handler
、Looper、MessageQueue
、Message
)先创建一个与一个线程相关联Handler实例(Handler与创建它的线程相关联,而且也只与创建它的线程相关联),在Handler的构造函数中获取该线程的Looper对象,然后将Handler与Looper绑定。Handler通过post()、sendMessage()等方法将一个Message对象插入到Looper的MessageQueue中,Looper会不断地从MessageQueue中取出Message并将其传递给Handler的dispatchMessage()方法,dispatchMessage()方法负责处理取出的Message,根据Message的类型执行相应的操作,如回调、更新UI等。
6.Service相关知识。
Service根据使用方式有两种:startService、bindService。
startService&bindService使用场景的学习理解_weixin_34101229的博客-CSDN博客
Android四大组件——Service详解_android service使用场景_c小旭的博客-CSDN博客
Android中Service的简单使用_android service使用_贪睡的汤圆的博客-CSDN博客
【Android开发基础】四大组件之一Service(服务)的应用场景及使用(以实时聊天为例)_android service使用场景_云端new守夜人的博客-CSDN博客
7.多线程相关知识。
可能会问(多个线程访问同一个变量)如何解决
1.synchronized加锁后用到的变量才会从主内存拉取、才会修改后刷新回主内存。
2.volatile
Java多线程变量共享与隔离_骑个小蜗牛的博客-CSDN博客
Android面试---多线程_android多线程面试题_Liknananana的博客-CSDN博客
还会问(是否使用过线程池)
Java并发编程面试题——线程池_代码星辰的博客-CSDN博客
8.Android动画类型分类
逐帧动画【Frame Animation】,即顺序播放事先准备的图片。
补间动画【Tween Animation】,即平移、缩放、旋转、透明度。
属性动画【Property Animation】,补间动画增强版,支持对对象执行动画。
过渡动画【Transition Animation】,实现Activity或View过渡动画效果。包括5.0之后的MD过渡动画等。
Http是应用层协议,在TCP/IP协议接收到数据之后通过HTTP协议来解析才可以使用。
传输层:实际传输数据。(TCP、UDP协议)
Http的请求过程
1、域名解析
2、发起TCP的3次握手
3、建立TCP连接后发起Http请求
4、服务器端响应Http请求,并回传数据
5、客户端获取数据并解析展示在前端界面
TCP和UDP的区别
- TCP:面向连接,可靠的,速度慢、效率低,适用于需要传输可靠的数据时使用。
- UDP:无连接,不可靠,速度快、效率高,适用于高效传输忽略可靠性时使用。
10.MVC、MVP、MVVM区别
Android之Mvc、Mvp、Mvvm_mvvm presenter_天若子的博客-CSDN博客
Android 架构 MVC MVP MVVM,这一波你应该了然于心
一篇文章讲清楚Android中的MVC、MVP、MVVM架构 (附实现代码)_安卓mvc_bugyinyin的博客-CSDN博客
11.进程间通信
android中进程间通信的几种方式_android进程间通信_追梦人-涛的博客-CSDN博客
12.WebView与H5交互
Android进阶之路 - 通过WebView与H5前端进行完美交互_webview与h5交互_Modu_MrLiu的博客-CSDN博客
13.Android进程间通信
android中进程间通信的几种方式_android进程间通信_追梦人-涛的博客-CSDN博客
带你深入了解Android进程间通信_android 进程间通信有几种_老王学长的博客-CSDN博客
android中进程间通信的几种方式_android进程间通信_追梦人-涛的博客-CSDN博客
14.RxJava+Retrofit+OkHttp
Rx系列<第三十二篇>:RxJava+Retrofit+OkHttp+MVP - 简书
15.RxJava的原理
Android开发面试之RxJava_51CTO博客_android rxjava面试题
16.Kotlin
可能会问项目中是否使用协程和协程的相关知识
Android 上的 Kotlin 协程 | Android Developers