秋招Android进阶面经,面试10余家经验分享,拿到offer真不难( 二 )


4.ANR 出现的场景以及解决方案?
参考答案:
场景: 1、触摸无响应5s 2、BroadCastReciver 前台处理超过10s 后台超过60s 3、Server 前台处理超过20s 后台超过200s
ANR出现的类型有两种 1、主线程耗时导致 2、CPU、内存、IO 占用过高资源耗尽(其他进程也可以导致)
如何避免: 1、不要在主线程中做耗时的操作 2、避免CPU占用过高,简化方法,减少执行时间 3、避免内存占用过高,防止内存泄漏
5.谈谈 Android 中内存优化的方式?
参考答案:
关于内存泄漏,一般像单例模式的使用不当啊、集合的操作不当啊、资源的缺乏有效的回收机制啊、Handler、线程的使用不当等等都有可能引发内存泄漏 。

  1. 单例模式引发的内存泄漏: 原因:单例模式里的静态实例持有对象的引用,导致对象无法被回收,常见为持有Activity的引用 优化:改为持有Application的引用,或者不持有使用的时候传递 。
  2. 集合操作不当引发的内存泄漏: 原因:集合只增不减 优化:有对应的删除或卸载操作
  3. 线程的操作不当引发的内存泄漏: 原因:线程持有对象的引用在后台执行,与对象的生命周期不一致 优化:静态实例+弱引用(WeakReference)方式,使其生命周期一致
  4. 匿名内部类/非静态内部类操作不当引发的内存泄漏: 原因:内部类持有对象引用,导致无法释放,比如各种回调 优化:保持生命周期一致,改为静态实例+对象的弱引用方式(WeakReference)
  5. 常用的资源未关闭回收引发的内存泄漏: 原因:BroadcastReceiver,File,Cursor,IO流,Bitmap等资源使用未关闭 优化:使用后有对应的关闭和卸载机制
  6. Handler使用不当造成的内存泄漏: 原因:Handler持有Activity的引用,其发送的Message中持有Handler的引用,当队列处理Message的时间过长会导致Handler无法被回收 优化:静态实例+弱引用(WeakReference)方式 内存溢出: 原因: 1.内存泄漏长时间的积累 2.业务操作使用超大内存 优化: 1.调整图像大小后再放入内存、及时回收 2.不要过多的创建静态变量

秋招Android进阶面经,面试10余家经验分享,拿到offer真不难

文章插图
 
6.为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?
参考答案:
  • 1)空间冗余:图像相邻像素之间有较强的相关性
  • 2)时间冗余:视频序列的相邻图像之间内容相似
  • 3)编码冗余:不同像素值出现的概率不同
  • 4)视觉冗余:人的视觉系统对某些细节不敏感
  • 5)知识冗余:规律性的结构可由先验知识和背景知识得到
7.怎么做到直播秒开优化?
参考答案:
  • DNS 解析慢 为了有效降低 DNS 解析对首开的影响,我们可以提前完成播放域名->IP 地址的解析,并缓存起来,播放的时候,直接传入带 IP 地址的播放地址,从而省去了 DNS 解析的耗时 。如果要支持用 IP 地址播放,是需要修改底层 ffmpeg 源码的 。
  • 播放策略 很多侧重点播的播放器,为了减少卡顿,会有一些缓冲策略,当缓冲足够多的数据之后 ,再送入解码播放 。
而为了加快首开效果,需要对播放的缓冲策略做一些调整,如果第一帧还没有渲染出来的情况下,不要做任何缓冲,直接送入解码器解码播放,这样就可以保证没有任何因为「主动」缓冲带来的首开延时 。
  • 播放参数设置 所有基于 ffmpeg 的播放器,都会遇到avformat_find_stream_info这个函数耗时比较久,从而增大了首开时间,该函数主要作用是通过读取一定字节的码流数据,来分析码流的基本信息,如编码信息、时长、码率、帧率等等,它由两个参数来控制其读取的数据量大小和时长,一个是 probesize,一个是 analyzeduration 。
减少 probesize 和 analyzeduration 可以有效地减少avformat_find_stream_info的函数耗时,从而加快首开,但是需要注意的是,设置地太小可能会导致读取的数据量不足,从而无法解析出码流信息,导致播放失败,或者出现只有音频没有视频,只有视频没有音频的问题 。
  • 服务端优化
  • 服务器关键帧缓冲
  • CDN最近策略
8.直方图在图像处理里面最重要的作用是什么?
参考答案:
  1. 灰度直方图的定义:灰度级的函数,描述图像中该灰度级的像素个数或该灰度级像素出现的频率 。反映了图像灰度分布的情况 。


    推荐阅读