把面试官唬住了,就要50K。没唬住,就要5K!Android开发社招面试

本文详细探讨了Android开发中的关键技术,包括图片缓存管理、WebView性能优化策略、Bitmap处理大图防止OOM、内存回收机制与GC算法、内存泄露与溢出的区别、应用启动优化以及面试中可能遇到的相关问题。
摘要由CSDN通过智能技术生成

首先我们要清楚图片的三级缓存是如何的

如果内存足够时不回收。内存不够时就回收软引用对象

2、内存中如果加载一张 500*500 的 png 高清图片.应该是占用多少的内存?
  • 不考虑屏幕比的话: 占用内存=500 * 500 * 4 = 1000000B ≈
    0.95MB
  • 考虑屏幕比的的话: 占用内存= 宽度像素 x (inTargetDensity / inDensity) x 高度像素 x(inTargetDensity / inDensity)x 一个像素所占的内存字节
    大小
  • inDensity 表示目标图片的 dpi(放在哪个资源文件夹下),
    inTargetDensity 表示目标屏幕的 dpi
3、WebView 的性能优化 ?

一个加载网页的过程中,native、网络、后端处理、CPU 都会
参与,各自都有必要的工作和依赖关系;让他们相互并行处理
而不是相互阻塞才可以让网页加载更快:

  • WebView 初始化慢,可以在初始化同时先请求数据,
    让后端和网络不要闲着。
  • 常用 JS 本地化及延迟加载,使用第三方浏览内核
  • 后端处理慢,可以让服务器分 trunk 输出,在后端计算
    的同时前端也加载网络静态资源。
  • 脚本执行慢,就让脚本在最后运行,不阻塞页面解析。
  • 同时,合理的预加载、预缓存可以让加载速度的瓶颈更
    小。
  • WebView 初始化慢,就随时初始化好一个 WebView
    待用。
  • DNS 和链接慢,想办法复用客户端使用的域名和链接。
4、Bitmap 如何处理大图,如一张 30M 的大图,如何预防 OOM?

参考回答: 避免 OOM 的问题就需要对大图片的加载进行管理,主要通
过缩放来减小图片的内存占用。

  • BitmapFactory 提供的加载图片的四类方法(decodeFile
    decodeResourcedecodeStreamdecodeByteArray
    都支持 BitmapFactory.Options 参数,通过 inSampleSize
    数就可以很方便地对一个图片进行采样缩放
  • 比如一张 10241024 的高清图片来说。那么它占有的内存为
    102410244,即 4MB,如果 inSampleSize 为 2,那么采样后
    的图片占用内存只有 512512*4,即 1MB(注意:根据最新的官
    方文档指出,inSampleSize 的取值应该总是为 2 的指数,即
    1、2、4、8 等等,如果外界输入不足为 2 的指数,系统也会默
    认选择最接近 2 的指数代替,比如 2)
  • 综合考虑。通过采样率即可有效加载图片,流程如下
  • BitmapFactory.Options
    inJustDecodeBounds 参数设为 true 并加载图片
  • BitmapFactory.Options 中取出图片的原始宽高信
    息,它们对应 outWidth 和 outHeight 参数
  • 根据采样率的规则并结合目标 View 的所需大小计算出
    采样率 inSampleSize
  • BitmapFactory.Options
    inJustDecodeBounds 参数设为 false,重新加载图片
5、内存回收机制与 GC 算法(各种算法的优缺点以及应用场景);GC 原理时机以及 GC 对象

参考回答:

内存判定对象可回收有两种机制:

  • 引用计数算法: 给对象中添加一个引用计数器,每当有
    一个地方引用它时,计数器值就加 1;当引用失效时,
    计数器值就减 1;任何时刻计数器为 0 的对象就是不可
    能再被使用的。然而在主流的 Java 虚拟机里未选用引用
    计数算法来管理内存,主要原因是它难以解决对象之间相互循环引用的问题,所以出现了另一种对象存活判定
    算法。

  • 可达性分析法: 通过一系列被称为『GCRoots』的对象
    作为起始点,从这些节点开始向下搜索,搜索所走过的
    路径称为引用链,当一个对象到 GC Roots 没有任何引
    用链相连时,则证明此对象是不可用的。其中可作为 GC
    Roots 的对象:虚拟机栈中引用的对象,主要是指栈帧
    中的本地变量*、本地方法栈中 Native 方法引用的对
    象、方法区中类静态属性引用的对象、方法区中常量引
    用的对象

GC 回收算法有以下四种:

  • 分代收集算法: 是当前商业虚拟机都采用的一种算法,
    根据对象存活周期的不同,将 Java 堆划分为新生代和老
    年代,并根据各个年代的特点采用最适当的收集算法。
  • 新生代: 大批对象死去,只有少量存活。使用『复制算
    法』,只需复制少量存活对象即可。
  • 复制算法: 把可用内存按容量划分为大小相等的
    两块,每次只使用其中的一块。当这一块的内存
    用尽后,把还存活着的对象『复制』到另外一块
    上面,再将这一块内存空间一次清理掉。实现简单,运行高效。在对象存活率较高时就要进行较多的复制操作,效率将会变低
  • 老年代: 对象存活率高。使用『标记—清理算法』或者
    『标记—整理算法』,只需标记较少的回收对象即可。
  • 标记-清除算法: 首先『标记』出所有需要回收
    的对象,然后统一『清除』所有被标记的对象。
    标记和清除两个过程的效率都不高,清除之后会
    产生大量不连续的内存碎片,空间碎片太多可能
    会导致以后在程序运行过程中需要分配较大对象
    时,无法找到足够的连续内存而不得不提前触发
    另一次垃圾收集动作。
  • 标记-整理算法: 首先『标记』出所有需要回收
    的对象,然后进行『整理』,使得存活的对象都
    向一端移动,最后直接清理掉端边界以外的内
    存。标记整理算法会将所有的存活对象移动到一
    端,并对不存活对象进行处理,因此其不会产生
    内存碎片
6、内存泄露和内存溢出的区别 ?AS 有什么工具可以检测内存泄露
  • 内存溢出(out of memory): 是指程序在申请内存时,没有足
    够的内存空间供其使用,出现 out of memory;比如申请了一
    个 integer,但给它存了 long 才能存下的数,那就是内存溢
    出。
  • 内存泄露(memory leak): 是指程序在申请内存后,无法释放
    已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露
    堆积后果很严重,无论多少内存,迟早会被占光。memory leak
    会最终会导致 out of memory!
  • 查找内存泄漏可以使用 Android Studio 自带的
    AndroidProfiler 工具或 MAT
7、性能优化,怎么保证应用启动不卡顿? 黑白屏怎么处理?
  • 应用启动速度,取决于你在 application 里面时候做了什么事
    情,比如你集成了很多 sdk,并且 sdk 的 init 操作都需要在主
    线程里实现所以会有卡顿的感觉。在非必要的情况下可以把加
    载延后或则开启子线程处理

  • 另外,影响界面卡顿的两大因素,分别是界面绘制和数据处
    理。

  • 布局优化(使用 include,merge 标签,复杂布局推荐使
    ConstraintLayout 等)

  • onCreate() 中不执行耗时操作 把页面显示的 View 细
    分一下,放在 AsyncTask 里逐步显示,用 Handler
    更好。这样用户的看到的就是有层次有步骤的一个个的
    View 的展示,不会是先看到一个黑屏,然后一下显示
    所有 View。最好做成动画,效果更自然。

  • 利用多线程的目的就是尽可能的减少 onCreate()
    onReume() 的时间,使得用户能尽快看到页面,操作
    页面。

  • 减少主线程阻塞时间。

  • 提高 Adapter 和 AdapterView 的效率。

  • 黑白屏产生原因: 当我们在启动一个应用时,系统会去检查是
    否已经存在这样一个进程,如果不存在,系统的服务会先检查
    startActivity 中的 intent 的信息,然后在去创建进程,最后启
    Acitivy,即冷启动。而启动出现白黑屏的问题,就是在这段
    时间内产生的。系统在绘制页面加载布局之前,首先会初始化
    窗口(Window),而在进行这一步操作时,系统会根据我们设
    置的 Theme 来指定它的 Theme 主题颜色,我们在 Style 中的
    设置就决定了显示的是白屏还是黑屏。

  • windowIsTranslucent windowNoTitle,将这两个
    属性都设置成 true (会有明显的卡顿体验,不推荐)

  • 如果启动页只是是一张图片,那么为启动页专一设置一
    个新的主题,设置主题的
    android:windowBackground 属性为启动页背景图即

  • 使用 layer-list 制作一张图片 launcher_layer.xml,将其
    设置为启动页专一主题的背景,并将其设置为启动页布
    局的背景。

8、强引用置为 null,会不会被回收?

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【算法合集】

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】

Android精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

urd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值