面试:若是不许备充分的面试,彻底是浪费时间,更是对本身的不负责。java
今天给你们分享下我整理的BAT架构面试专题及答案,其中大部分都是大企业面试常问的面试题,能够对照这查漏补缺,固然了,这里所列的确定不可能覆盖所有方式,不过也但愿能对即将找工做的朋友起到一些帮助!在这因为文字不少,我总结了Android面试所涉及到的常问范围及架构面试专题和答案解析和架构视频资料分享给你们
![]()
更多完整项目下载。未完待续。源码。图文知识后续上传github。)
能够点击关于我联系我获取完整PDF或者互相交流
( VX:mm14525201314)
今天先来分析一下Bitmap+Handler+性能优化git
1)要选择合适的图片规格(bitmap 类型): 一般咱们优化Bitmap 时,当须要作性能优化或者防止 OOM
,咱们一般会使用 RGB_565,由于 ALPHA_8 只有透明度,显示通常图片没有意义,Bitmap.Config.ARGB_4444
显示图片不清楚,Bitmap.Config.ARGB_8888
占用内存最多。:程序员
2)下降采样率: BitmapFactory.Options
参数 inSampleSize
的使用,先把 options.inJustDecodeBounds
设为 true,只是去读取图片的大小,在拿到图片的大小以后和要显示的大小作比较经过 calculateInSampleSize()
函数计算 inSampleSize
的具体值,获得值以后。options.inJustDecodeBounds
设为 false读图片资源。github
3)复用内存: 即经过软引用(内存不够的时候才会回收掉),复用内存块,不须要再从新给这个 bitmap 申请一块新的内存,避免了一次内存的分配和回收,从而改善了运行效率。面试
4)使用 recycle()方法及时回收内存。算法
5)压缩图片缓存
经过源码能够了解到,加载 Bitmap 到内存里之后,是包含两部份内存区域的。简单的说,一部分是 Java 部分的,一部分是 C部分的。这个 Bitmap 对象是由 Java 部分分配的,不用的时候系统就会自动回收了安全
可是那个对应的 C 可用的内存区域,虚拟机是不能直接回收的,这个只能调用底层的功能释放。因此须要调用 recycle()
方法来释放 C 部分的内存性能优化
bitmap.recycle()
方法用于回收该 Bitmap 所占用的内存,接着将 bitmap 置空,最后使用 System.gc()
调用一下系统的垃圾回收器进行回收,调用 System.gc()
并不能保证当即开始进行回收过程,而只是为了加快回收的到来架构
Bitamp 所占内存大小 = 宽度像素 x (inTargetDensity /inDensity) x 高度像素 x (inTargetDensity / inDensity)x 一个像素所占的内存字节大小
注: 这里 inDensity
表示目标图片的 dpi(放在哪一个资源文件夹下),inTargetDensity
表示目标屏幕的 dpi,因此你能够发现 inDensity
和 inTargetDensity
会对Bitmap 的宽高进行拉伸,进而改变 Bitmap 占用内存的大小。
在 Bitmap 里有两个获取内存占用大小的方法。
getByteCount()
:API12
加入,表明存储 Bitmap 的像素须要的最少内存。getAllocationByteCount()
:API19
加入,表明在内存中为 Bitmap 分配的内存大小,代替了getByteCount()
方法。getByteCount()
和getAllocationByteCount
返回的结果是同样的。在经过复用 Bitmap 来解码图片时,那么 getByteCount()
表示新解码图片占用内存的大 小,getAllocationByteCount()
表示被复用 Bitmap 真实占用的内存大小Android 的缓存更新策略没有统一的标准,通常来讲,缓存策略主要包含缓存的添加、获取和删除这三类操做,但不论是内存缓存仍是存储设备缓存,它们的缓存容量是有限制的,所以删除一些旧缓存并添加新缓存,如何定义缓存的新旧这就是一种策略,不一样的策略就对应着不一样的缓存算法
好比能够简单地根据文件的最后修改时间来定义缓存的新旧,当缓存满时就将最后修改时间较早的缓存移除,这就是一种缓存算法,但不算很完美
为减小流量消耗,可采用缓存策略。经常使用的缓存算法是LRU(Least Recently Used)
:当缓存满时, 会优先淘汰那些近期最少使用的缓存对象。主要是两种方式:
LruCache
(内存缓存):LruCache
类是一个线程安全的泛型类:内部采用一个 LinkedHashMap
以强引用的方式存储外界的缓存对象,并提供 get 和 put 方法来完成缓存的获取和添加操做,当缓存满时会移除较早使用的缓存对象,再添加新的缓存对象。DiskLruCache
(磁盘缓存): 经过将缓存对象写入文件系统从而实现缓存效果6.谈谈消息机制 Handler 做用 ?有哪些要素 ?流程是怎样的 ?
7.一个线程可否建立多个 Handler,Handler 跟 Looper 之间的对应关系 ?
8.软引用跟弱引用的区别
9.Handler 引发的内存泄露缘由以及最佳解决方案
10.为何系统不建议在子线程访问 UI?
11.Looper 死循环为何不会致使应用卡死?
12.使用 Handler 的 postDealy 后消息队列会有什么变化?
13.能够在子线程直接 new 一个 Handler 吗?怎么作?
14.Message 能够如何建立?哪一种效果更好,为何?
15.图片的三级缓存中,图片加载到内存中,若是内存快爆了,会发生什么?怎么处理?
17.WebView 的性能优化 ?
18.Bitmap 如何处理大图,如一张 30M 的大图,如何预防 OOM?
19.内存回收机制与 GC 算法(各类算法的优缺点以及应用场景);GC 原理时机以及 GC 对象
20.内存泄露和内存溢出的区别 ?AS 有什么工具能够检测内存泄露
21.性能优化,怎么保证应用启动不卡顿? 黑白屏怎么处理?
为了避免影响阅读,针对于上面的面试题我总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案解析及知识点参考作成了文档(983页PDF)和架构视频资料免费分享给你们!(含有从 基础到进阶。含有BATJ.字节跳动面试专题,算法专题,高端技术专题,混合开发专题,java面试专题,Android,Java小知识,到性能优化.线程.View.OpenCV.NDK等应有尽有。还有辅之 相关的视频+学习笔记)
整理不易,但愿你们在明年有个好的成功,分享是一种美德,以为不错的朋友能够点赞后分享给更多的朋友!
请查看完整的PDF版
(更多完整项目下载。未完待续。源码。图文知识后续上传github。)
能够点击关于我联系我获取完整PDF
(VX:mm14525201314)