【Android大厂面试题】百度二面(谈谈你对 Android 性能优化的了解())
面试题一:谈谈你对 Android 性能优化方面的了解?
1)启动优化: application中不要做大量耗时操作,如果必须的话,建议异步做耗时操作。
2)布局优化: 使用合理的控件选择,少嵌套。(合理使用 include,merge,viewStub等使用)
【【Android大厂面试题】百度二面(谈谈你对 Android 性能优化的了解())】3)apk优化(资源文件优化,代码优化,lint检查,.9.png,合理使用 shape 替代图片,webp等)
4)性能优化,网络优化,电量优化
- 避免轮询,尽量使用推送。
- 应用处于后台时,禁用某些数据传输
- 限制访问频率,失败后不要无限重连
- 选用合适的定位服务(GPS定位,网络定位,被动定位)
- 使用缓存
- startActivityForResult替代发送广播
- 循环尽量不使用局部变量
- 避免在onDraw中创建对象,onDraw会被频繁调用,容易造成内存抖动。循环中创建大的对象,也是如此。
- 不用的对象及时释放
- 数据库的cursor及时关闭
- adapter使用缓存
- 注册广播后,在生命周期结束时反注册
- 及时关闭流操作
- 图片尽量使用软引用,较大的图片可以通过 bitmapFactory 缩放后再使用,并及时recycler。另外加载巨图时不要 使用 setImageBitmap 或 setImageResourse 或BitmapFactory.decodeResource,这些方法拿到的都是 bitmap 的对象,占用内存较大。可以用 BitmapFactory.decodeStream 方法配合 BitmapFactory.Options 进行缩放。
- 避免 static 成员变量引用资源耗费过多实例
- 避免静态内部类的引用
- 资源对象没关闭造成的内存泄漏(如: Cursor、File 等)
- Bitmap 对象不在使用时调用 recycle() 释放内存
- 集合中对象没清理造成的内存泄漏(特别是 static 修饰的集合)
- 接收器、监听器注册没取消造成的内存泄漏
- Activity 的 Context 造成的泄漏,可以使用 ApplicationContext
- Handler 造成的内存泄漏问题(一般由于 Handler 生命周期比其外部类的生命周期长引起的)
- 自定义的静态handler
- 可以加一个弱引用
- 还有一个主意的就是当你activity被销毁的时候如果还有消息没有发出去就 remove 掉吧
- removecallbacksandmessages 去清除 Message 和 Runnable 加 null 写在生命周的ondestroy() 就行
- 例如 handler 在界面销毁的时候消息还未发送
- file 没有关流
- 查询到结果还没有停止
- 内部类持有外部类引用得不到释放
- 不用的对象最好 null 让 GC 回收一下
- 图片资源什么的最好加一个软引用
解决方案是对于耗时的操作,比如访问网络、访问数据库等操作,需要开辟子线程,在子线程处理耗时的操作,主线程主要实现UI的操作。
面试题六:谈谈 Android 中内存优化的方式? 关于内存泄漏,一般像单例模式的使用不当啊、集合的操作不当啊、资源的缺乏有效的回收机制啊、Handler、线程的使用不当等等都有可能引发内存泄漏。
1)单例模式引发的内存泄漏:
- 原因:单例模式里的静态实例持有对象的引用,导致对象无法被回收,常见为持有Activity的引用
- 优化:改为持有Application的引用,或者不持有使用的时候传递。
- 原因:集合只增不减
- 优化:有对应的删除或卸载操作
- 原因:线程持有对象的引用在后台执行,与对象的生命周期不一致
- 优化:静态实例+弱引用(WeakReference)方式,使其生命周期一致
- 原因:内部类持有对象引用,导致无法释放,比如各种回调
- 优化:保持生命周期一致,改为静态实例+对象的弱引用方式(WeakReference)
- 原因:BroadcastReceiver,File,Cursor,IO流,Bitmap等资源使用未关闭
- 优化:使用后有对应的关闭和卸载机制
- 原因:Handler持有Activity的引用,其发送的 Message 中持有 Handler 的引用,当队列处理 Message 的时间过长会导致 Handler 无法被回收
- 优化:静态实例+弱引用(WeakReference)方式
- 原因:内存泄漏长时间的积累;业务操作使用超大内存;
- 优化:调整图像大小后再放入内存、及时回收;不要过多的创建静态变量;
更多 Android 中高级面试题
文章图片
如果说求职是人生的一座山,那面试就是最难跨越的一道沟。有时候好不容易被通知去面试,结果被面试官虐得体无完肤。 这里分享一份《2022中高级 Android 面试必知百题》,资料整体包括 Java 方面,Android 方面,kotlin方面,希望能给大家面试提供一些帮助。第一章:Java 部分
- Java基础部分
- Java合集
- Java多线程
- Java虚拟机
文章图片
第二章:Android 方面
- Android 四大组件相关
- Android 异步任务和消息机制
- Android UI 绘制相关
- Android 性能调优相关
- Android 中的 IPC
- Android 系统 SDK 相关
文章图片
- 第三方框架分析
- 综合技术
- 数据结构方面
- 设计模式
- 计算机网络方面
- Kotlin方面
文章图片
由于篇幅有限,这里只展示了面试题和部分内容截图,需要完整版《2022中高级 Android 面试必知百题》的朋友可以点击此处免费领取!
推荐阅读
- 宽容谁
- 我要做大厨
- android第三方框架(五)ButterKnife
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷
- 叙述作文
- 20190302|20190302 复盘翻盘