2022-02-23 安卓开发七年面试题总结
1:okhttp的责任链模式
顾名思义是将多个节点通过链条的方式连接起来,每一个节点相当于一个对象,而每一个对象层层相关,直接或者间接引用下一个对象(节点);直到链条中有一个节点处理头节点传下来的事件截止。
2:自定义View
onMeasure(测量),
measure的三种测量模式分别为
MeasureSpec.EXACTLY,
MeasureSpec.AT_MOST,
MeasureSpec.UNSPECIFIED,
onLayout(摆放),
OnDraw(绘制),
继承自View或者ViewGroup然后测量摆放绘制,然后做做动画,最后写写接口给调用者调用。
3:Glide的三级缓存
因为android默认给每一个应用分配16M的内存,如果加载过多的图片的话,为了防止内存溢出(其实要区分一下内存泄漏的概念)。
三级缓存策略,最实在的意义就是 减少不必要的流量消耗,增加加载速度 。
- 内存缓存,优先加载,速度最快
- 本地缓存,次优先加载,速度快
- 网络缓存,最后加载,速度慢,浪费流量
Bitmap 的创建非常消耗时间和内存,可能导致频繁GC。而使用缓存策略,会更加高效地加载 Bitmap,减少卡顿,从而减少读取时间。
内存作为一级缓存,本地作为二级缓存,网络加载为最后。其中,内存使用 LruCache ,其内部通过 LinkedhashMap 来持有外界缓存对象的强引用;对于本地缓存,使用 DiskLruCache。加载图片的时候,首先使用 LRU 方式进行寻找,找不到指定内容,按照三级缓存的方式,进行本地搜索,还没有就网络加载。
如果使用hashmap去存储图片时,当图片越来越多,那么会造成内存溢出,因为是强引用(对于强引用的系统不会回收)
如果改成软引用softReference,在android 2.3 以上的系统,对象会被提前回收。
ps:
软引用:软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。
弱引用:被软引用关联的对象只有在内存不足时才会被回收,而被弱引用关联的对象在JVM进行垃圾回收时总会被回收。
利用软引用和弱引用解决OOM问题:假如有一个应用需要读取大量的本地图片,如果每次读取图片都从硬盘读取,则会严重影响性能,但是如果全部加载到内存当中,又有可能造成内存溢出,此时使用软引用可以解决这个问题。
设计思路是:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题。
4:安卓性能优化
- 稳定(内存溢出、崩溃)
- 流畅(卡顿)
- 耗损(耗电、流量、网络)
- 安装包(APK瘦身)
Android 系统每隔 16ms 发出 VSYNC 信号,渲染成功可以达到60Fps。
如果渲染失败就会卡顿,丢帧。原因:
- 绘制任务太重,绘制一帧内容耗时太长
- 主线程太忙,根据系统传递过来的 VSYNC 信号来时还没准备好数据导致丢帧
布局优化
- 布局复用,使用
<include>
标签重用layout; - 提高显示速度,使用
<ViewStub>
延迟View加载; - 减少层级,使用
<merge>
标签替换父级布局; - 注意使用wrap_content,会增加measure计算成本;
- 删除控件中无用属性;
启动优化
应用一般都有闪屏页,优化闪屏页的 UI 布局,可以通过 Profile GPU Rendering 检测丢帧情况。
也可以通过启动加载逻辑优化。可以采用分布加载、异步加载、延期加载策略来提高应用启动速度。
数据准备。数据初始化分析,加载数据可以考虑用线程初始化等策略
Android性能优化--启动优化 - 简书(详情具体冷热启动优化)
APK瘦身
代码混淆。使用proGuard 代码混淆器工具,它包括压缩、优化、混淆等功能。
资源优化。比如使用 Android Lint 删除冗余资源,资源文件最少化等。
图片优化。比如利用 AAPT 工具对 PNG 格式的图片做压缩处理,降低图片色彩位数等。
避免重复功能的库,使用 WebP图片格式等。
插件化,比如功能模块放在服务器上,按需下载,可以减少安装包大小。
Android性能优化--启动优化 - 简书
5:事件分发机制(处理滑动冲突)
Activity>viewgroup>view
事件分发方法
dispatchTouchEvent() 、onInterceptTouchEvent()和onTouchEvent()
6:Rxevenbus的使用以及原理
7:安卓多线程
Android多线程的四种方式 - 简书
8:jvm原理
关于JVM原理_摇曳的精灵的博客-CSDN博客_jvm原理
9:ARouter或者DRouter
面试:ARouter原理_王温暖的博客-CSDN博客_arouter 原理
滴滴开源DRouter:一款高效的Android路由框架 - 简书
10:热更新
热更新你都知道哪些?_luo_boke的博客-CSDN博客_热更新
11:动画有几类,分别有什么特点?
- 1. 动画的基本原理:其实就是利用插值器和估值器,来计算出各个时刻 View 的属性,然后通过改变 View 的属性来,实现 View 的动画效果。
- 2.View 动画: 只是影像变化,view 的实际位置还在原来的地方。
- 3. 帧动画是在 xml 中定义好一系列图片之后,使用 AnimationDrawable 来播放的动画。
- 4.View 的属性动画:
- 1. 插值器(Interpolator):作用是根据时间的流逝的百分比来计算属性改变的百分比
- 2. 估值器(TypeEvaluator):在 1 的基础上由这个东西来计算出属性到底变化了多少数值的类
12:模块化,组件化,插件化开发
模块化:为了解决重用问题,不强调单独编译
组件化: 为了功能拆分,强调单独编译
插件化:所有组件都为apk的特殊组件化,特点热更新
通讯方式不同点:
模块化相互引入,需要引入的module
组件化的通讯方式为隐式和路由
插件化本身是不同进程,因此是binder机制进行进程间通信
13:JectPack
定义:组件库
作用:使用 Jetpack 可以帮助我们在不同的 Android 版本和不同的设备上,实现行为一致的工作代码。
面试常问到的
Lifecycles组件:定制能自动响应activity\Fragment生命周期的组件
LiveData:可被观察订阅的数据,数据发生变化能够通知 activie 态的 观察者
ViewModel:一种新的 保存 UI相关 数据的 组件,这种组件能够响应 activity\Fragment生命周期,当configuration发生变化,activity重新创建,它仍然活着,能够快速响应上一次获取的数据。
Pageing:分批加载,能够从指定数据源(比如Room数据库)分批加载数据,能配合PagedListAdapter、RecylerView实现分页加载,并且实现了==diff机制==,能够局部更新。
Room:Google对于sqlite的一层抽象和包装,实现了ORM,主要优点是体积小,编译检查sql语法,可测试。
详细的组件分类传送门:
JectPack的详细讲解分类_牵着蜗牛去散步zjp的博客-CSDN博客
14:Fragment的生命周期
相对Activity多了
onAttach(在Fragment 和 Activity 建立关联是调用)
oncreate
onCreatView(当Fragment 创建视图时调用)
onActivityCreated(在相关联的 Activity 的 onCreate() 方法已返回时调用)
onStart
onResume
onPause
onStop
onDestroyView(当Fragment中的视图被移除时调用)
onDestory
onDetach(当Fragment 和 Activity 取消关联时调用)
Fragment 生命周期与 Activity 生命周期的一个关键区别就在于,Fragment 的生命周期方法是由托管Activity而不是操作系统调用的。Activity 中生命周期方法都是 protected,而 Fragment 都是 public,也能印证了这一点,因为 Activity 需要调用 Fragment 那些方法并管理它。
2022-02-23 安卓开发七年面试题总结相关推荐
- 2022.02.23
今天看完了<大染坊>,书是好书,少有的到结尾都吸引我看完,做成一件事还是很有成就的,准备开始下一本的书. 游戏就浮浮沉沉了,最好的时候就差三把连胜就能成功,却每每往下浮沉,占据时间颇多,每 ...
- 2022年java中级开发工程师最新面试题
1.JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Runtime Env ...
- 记录安卓开发工程师的面试题
简述事件的派发流程,事件如何拦截? 如何实现一个ajax请求过程? 一个例子,用es5和es6分别写出来, react2.0和react3.0..... 简述浏览器缓存 如何优化页面卡顿的问题
- PMP 项目管理 考前专题(02)敏捷开发专题总结
系列文章解读&说明: 本模块分享的内容: PMP 项目管理 考前专题(01)考试技巧 & 策略总结 PMP 项目管理 考前专题(02)敏捷开发专题总结 PMP 项目管理 考前专题(03 ...
- 安卓开发app版本更新
安卓开发实战之app之版本更新升级(DownloadManager和http下载)完整实现 转载 wx610a246613cb02021-08-05 17:02:56博主文章分类:14 其他随笔©著作 ...
- 最新《微专业Android安卓开发工程师课程》
1.Android应用界面开发 资源下载 001 Android开发简介.flv 002 开始第一个应用.flv 003 Activity你必须知道的那些事(上).flv 004 Activity你必 ...
- 安卓开发入门学习笔记
第一天 1.LinearLayout,线性布局 vertically :垂直,纵向 horizontally:水平,横向 a:方向,默认横向 android:orientation="h ...
- Android安卓开发基础-Button与ImageButton
创建日期:公元2022年02月22日 修改日期:2022[03.03] 文章状态:未完待续 平台:Windows7 + Bunblebee 2021.1.1版AS 适用于:Java.xml.安卓开发 ...
- 《安富莱嵌入式周报》第252期:2022.02.07--2022.02.13
往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...
- Android安卓开发基础-TextView
创建日期:公元2022年02月22日 修改日期:- 文章状态:未完待续 平台:Windows7 + Bunblebee 2021.1.1版AS 适用于:Java.xml.安卓开发 ---------- ...
最新文章
- python为什么慢_python-为什么startswith比切片慢
- WordCount结对拓展
- 《Python程序设计(第3版)》[美] 约翰·策勒(John Zelle) 第 4 章 答案
- Android 5.x Theme 与 ToolBar 实战
- docker安装postgres
- JAVA入门级教学之(接口)
- c语言 dec2oct函数,【Excel函数】DEC2OCT函数 - 曹海峰个人博客
- magento memcache缓存配置
- Linux下C程序进程地址空间布局[转]
- 【实习招聘】创新工场首席科学家、原ACL主席、MSRA副院长周明老师领导的NLP团队招聘机器翻译方向实习生...
- TeamViewer14试用版到期怎么解决--免费许可证(仅非商业用途)
- 菜鸟阿鑫对于一堆数组的总结以及理解
- OLED多级菜单记录
- 华为最终面试java_最全的华为面试题-java学习
- 7号团队-团队任务5:项目总结会
- echarts 横向条形图 对比
- mysql查询条件格式_条件格式
- 微信开发工具BUG(漏洞),魔法加法
- 英安特1600说明书_英安特AW-BM1600-8A电话线/GSM/IP三网合一报警控制主机
- MSK的CPM调制和I-Q调制