1:okhttp的责任链模式

顾名思义是将多个节点通过链条的方式连接起来,每一个节点相当于一个对象,而每一个对象层层相关,直接或者间接引用下一个对象(节点);直到链条中有一个节点处理头节点传下来的事件截止。

2:自定义View

onMeasure(测量),

measure的三种测量模式分别为

MeasureSpec.EXACTLY,

MeasureSpec.AT_MOST,

MeasureSpec.UNSPECIFIED,

onLayout(摆放),

OnDraw(绘制),

继承自View或者ViewGroup然后测量摆放绘制,然后做做动画,最后写写接口给调用者调用。

3:Glide的三级缓存

因为android默认给每一个应用分配16M的内存,如果加载过多的图片的话,为了防止内存溢出(其实要区分一下内存泄漏的概念)。

三级缓存策略,最实在的意义就是 减少不必要的流量消耗,增加加载速度 。

  1. 内存缓存,优先加载,速度最快
  2. 本地缓存,次优先加载,速度快
  3. 网络缓存,最后加载,速度慢,浪费流量

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:安卓性能优化

  1. 稳定(内存溢出、崩溃)
  2. 流畅(卡顿)
  3. 耗损(耗电、流量、网络)
  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 安卓开发七年面试题总结相关推荐

  1. 2022.02.23

    今天看完了<大染坊>,书是好书,少有的到结尾都吸引我看完,做成一件事还是很有成就的,准备开始下一本的书. 游戏就浮浮沉沉了,最好的时候就差三把连胜就能成功,却每每往下浮沉,占据时间颇多,每 ...

  2. 2022年java中级开发工程师最新面试题

    1.JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Runtime Env ...

  3. 记录安卓开发工程师的面试题

    简述事件的派发流程,事件如何拦截? 如何实现一个ajax请求过程? 一个例子,用es5和es6分别写出来, react2.0和react3.0..... 简述浏览器缓存 如何优化页面卡顿的问题

  4. PMP 项目管理 考前专题(02)敏捷开发专题总结

    系列文章解读&说明: 本模块分享的内容: PMP 项目管理 考前专题(01)考试技巧 & 策略总结 PMP 项目管理 考前专题(02)敏捷开发专题总结 PMP 项目管理 考前专题(03 ...

  5. 安卓开发app版本更新

    安卓开发实战之app之版本更新升级(DownloadManager和http下载)完整实现 转载 wx610a246613cb02021-08-05 17:02:56博主文章分类:14 其他随笔©著作 ...

  6. 最新《微专业Android安卓开发工程师课程》

    1.Android应用界面开发 资源下载 001 Android开发简介.flv 002 开始第一个应用.flv 003 Activity你必须知道的那些事(上).flv 004 Activity你必 ...

  7. 安卓开发入门学习笔记

    第一天 1.LinearLayout,线性布局  vertically :垂直,纵向  horizontally:水平,横向 a:方向,默认横向 android:orientation="h ...

  8. Android安卓开发基础-Button与ImageButton

    创建日期:公元2022年02月22日 修改日期:2022[03.03] 文章状态:未完待续 平台:Windows7 + Bunblebee 2021.1.1版AS 适用于:Java.xml.安卓开发 ...

  9. 《安富莱嵌入式周报》第252期:2022.02.07--2022.02.13

    往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...

  10. Android安卓开发基础-TextView

    创建日期:公元2022年02月22日 修改日期:- 文章状态:未完待续 平台:Windows7 + Bunblebee 2021.1.1版AS 适用于:Java.xml.安卓开发 ---------- ...

最新文章

  1. python为什么慢_python-为什么startswith比切片慢
  2. WordCount结对拓展
  3. 《Python程序设计(第3版)》[美] 约翰·策勒(John Zelle) 第 4 章 答案
  4. Android 5.x Theme 与 ToolBar 实战
  5. docker安装postgres
  6. JAVA入门级教学之(接口)
  7. c语言 dec2oct函数,【Excel函数】DEC2OCT函数 - 曹海峰个人博客
  8. magento memcache缓存配置
  9. Linux下C程序进程地址空间布局[转]
  10. 【实习招聘】创新工场首席科学家、原ACL主席、MSRA副院长周明老师领导的NLP团队招聘机器翻译方向实习生...
  11. TeamViewer14试用版到期怎么解决--免费许可证(仅非商业用途)
  12. 菜鸟阿鑫对于一堆数组的总结以及理解
  13. OLED多级菜单记录
  14. 华为最终面试java_最全的华为面试题-java学习
  15. 7号团队-团队任务5:项目总结会
  16. echarts 横向条形图 对比
  17. mysql查询条件格式_条件格式
  18. 微信开发工具BUG(漏洞),魔法加法
  19. 英安特1600说明书_英安特AW-BM1600-8A电话线/GSM/IP三网合一报警控制主机
  20. MSK的CPM调制和I-Q调制

热门文章

  1. 串口通信那些事儿:通信电平转换电路
  2. 个人作业——软件产品案例分析
  3. WPF学习笔记--插入本地链接、url链接
  4. Windows 查看主板型号
  5. 《西方哲学史》阅读笔记
  6. 国内公有云对比(1.5)- 功能篇之青云
  7. 《紫川》之远东战火 第八卷
  8. Oracle PL-SQL基础知识
  9. 有关rand(),srand()产生随机数学习总结
  10. Axure RP 9笔记