面试相关之 Android(四)
Bitmap
1. 加载图片的时候需要注意什么?
参考回答:
直接加载大容量的高清Bitmap很容易出现显示不完整、内存溢出OOM的问题,所以最好按一定的采样率将图片缩小后再加载进来
为减少流量消耗,可对图片采用内存缓存策略,又为了避免图片占用过多内存导致内存溢出,最好以软引用方式持有图片
如果还需要网上下载图片,注意要开子线程去做下载的耗时操作
2. LRU算法的原理?
参考回答:
为减少流量消耗,可采用缓存策略。常用的缓存算法是LRU(Least Recently Used):
核心思想:当缓存满时, 会优先淘汰那些近期最少使用的缓存对象。主要是两种方式:
LruCache(内存缓存):LruCache类是一个线程安全的泛型类:内部采用一个LinkedHashMap以强引用的方式存储外界的缓存对象,并提供get和put方法来完成缓存的获取和添加操作,当缓存满时会移除较早使用的缓存对象,再添加新的缓存对象。
DiskLruCache(磁盘缓存): 通过将缓存对象写入文件系统从而实现缓存效果
3. Android中缓存更新策略?
参考:缓存更新的套路
性能优化
4. 项目中如何做性能优化的?
思路:
举例说明项目注意了哪些方面的性能优化,如布局优化、绘制优化、内存泄漏优化、 响应速度优化、列表优化、Bitmap优化、 线程优化......
5. 了解哪些性能优化的工具?
思路:
做项目时是否使用过的系统自带的性能优化工具?公司是否有自己的性能优化工具?实现原理怎样的?
6. 布局上如何优化?列表呢?
参考回答:
布局优化的核心就是尽量减少布局文件的层级,常见的方式有:
多嵌套情况下可使用RelativeLayout减少嵌套。
布局层级相同的情况下使用LinearLayout,它比RelativeLayout更高效。
使用<include>标签重用布局、<merge>标签减少层级、<ViewStub>标签懒加载。
7. 内存泄漏是什么?为什么会发生?常见哪些内存泄漏的例子?都是怎么解决的?
参考回答:内存泄漏(Memory Leak)是指程序在申请内存后,无法释放已申请的内存空间。简单地说,发生内存泄漏是由于长周期对象持有对短周期对象的引用,使得短周期对象不能被及时回收。常见的几个例子和解决办法:
- 单例模式导致的内存泄漏:单例传入参数this来自Activity,使得持有对Activity的引用。
解决办法:传参context.getApplicationContext() - Handler导致的内存泄漏:Message持有对Handler的引用,而非静态内部类的Handler又隐式持有对外部类Activity的引用,使得引用关系会保持至消息得到处理,从而阻止了Activity的回收。
解决办法:使用静态内部类+WeakReference弱引用;当外部类结束生命周期时清空消息队列。 - 线程导致的内存泄漏:AsyncTask/Runnable以匿名内部类的方式存在,会隐式持有对所在Activity的引用。
解决办法:将AsyncTask和Runnable设为静态内部类或独立出来;在线程内部采用弱引用保存Context引用 - 资源未关闭导致的内存泄漏:未及时注销资源导致内存泄漏,如BraodcastReceiver、File、Cursor、Stream、Bitmap等。
解决办法:在Activity销毁的时候要及时关闭或者注销。
BraodcastReceiver:调用unregisterReceiver()注销;
Cursor,Stream、File:调用close()关闭;
动画:在Activity.onDestroy()中调用Animator.cancel()停止动画
8. 内存泄漏和内存溢出的区别?
参考回答:
内存泄漏(Memory Leak)是指程序在申请内存后,无法释放已申请的内存空间。是造成应用程序OOM的主要原因之一。
内存溢出(out of memory)是指程序在申请内存时,没有足够的内存空间供其使用。
9. 什么情况会导致内存溢出?
参考回答:
内存泄漏是导致内存溢出的主要原因;直接加载大图片也易造成内存溢出
谷歌新动态
10. 是否了解和使用过谷歌推出的新技术?
11. 有了解刚发布的Androidx.0的特性吗?
12. Kotlin对Java做了哪些优化?
第三方库源码分析
13. 你项目中用到哪些开源库?说说其实现原理?
参考回答:
Retrofit源码分析
okhttp源码解析
Glide源码分析
EventBus 源码解析
RxJava 详解
Data Binding(数据绑定)用户指南
greenDAO 使用心得
AsyncTask源码分析
Handler事件机制
ARouter原理
Gradle
项目相关
14. 使用那些版本控制工具?Git和SVN的区别?
参考回答:
Git和SVN的区别有以下几点:
Git是分布式的,而SVN是集中式的(核心区别)
Git按元数据方式存储内容,而SVN按文件存储内容
在Git上每个工作成员可以任意在自己的本地版本库开启无限个分支且互不影响,而对于SVN分支是一个完整的目录且这个目录拥有完整的实际文件
Git没有一个全局的版本号,而SVN有
Git 的内容完整性要优于SVN
在Git中的绝大多数操作都只需要访问本地文件和资源,不必联网就可以看到所有的历史版本记录,而SVN 却需要联网