【Android大厂面试题】百度二面:谈谈你对 Android 性能优化的了解?

面试题一:谈谈你对 Android 性能优化方面的了解?

1)启动优化: application中不要做大量耗时操作,如果必须的话,建议异步做耗时操作。

2)布局优化: 使用合理的控件选择,少嵌套。(合理使用 include,merge,viewStub等使用)

3)apk优化(资源文件优化,代码优化,lint检查,.9.png,合理使用 shape 替代图片,webp等)

4)性能优化,网络优化,电量优化

  • 避免轮询,尽量使用推送。
  • 应用处于后台时,禁用某些数据传输
  • 限制访问频率,失败后不要无限重连
  • 选用合适的定位服务(GPS定位,网络定位,被动定位)
  • 使用缓存
  • startActivityForResult替代发送广播

5)内存优化

  • 循环尽量不使用局部变量
  • 避免在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 时如何有效地避免内存泄漏问题?

  • 自定义的静态handler
  • 可以加一个弱引用
  • 还有一个主意的就是当你activity被销毁的时候如果还有消息没有发出去就 remove 掉吧
  • removecallbacksandmessages 去清除 Message 和 Runnable 加 null 写在生命周的ondestroy() 就行

面试题四:哪些情况下会导致 OOM 问题?

  • 例如 handler 在界面销毁的时候消息还未发送
  • file 没有关流
  • 查询到结果还没有停止
  • 内部类持有外部类引用得不到释放
  • 不用的对象最好 null 让 GC 回收一下
  • 图片资源什么的最好加一个软引用

面试题五:ANR 出现的场景以及解决方案?

在Android中,应用的响应性被活动管理器(Activity Manager)和窗口管理(Window Manager)这两个系统服务所监视。当用户触发了输入事件(如键盘输入,点击按钮等),如果应用5秒内没有响应用户的输入事件,那么,Android会认为该应用无响应,便弹出ANR对话框。而弹出ANR异常,也主要是为了提升用户体验。

解决方案是对于耗时的操作,比如访问网络、访问数据库等操作,需要开辟子线程,在子线程处理耗时的操作,主线程主要实现UI的操作。

面试题六:谈谈 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)方式

7)内存溢出:

  • 原因:内存泄漏长时间的积累;业务操作使用超大内存;
  • 优化:调整图像大小后再放入内存、及时回收;不要过多的创建静态变量;

更多 Android 中高级面试题

如果说求职是人生的一座山,那面试就是最难跨越的一道沟。有时候好不容易被通知去面试,结果被面试官虐得体无完肤。这里分享一份《2022中高级 Android 面试必知百题》,资料整体包括 Java 方面,Android 方面,kotlin方面,希望能给大家面试提供一些帮助。

第一章:Java 部分

  • Java基础部分
  • Java合集
  • Java多线程
  • Java虚拟机

第二章:Android 方面

  • Android 四大组件相关
  • Android 异步任务和消息机制
  • Android UI 绘制相关
  • Android 性能调优相关
  • Android 中的 IPC
  • Android 系统 SDK 相关

  • 第三方框架分析
  • 综合技术
  • 数据结构方面
  • 设计模式
  • 计算机网络方面
  • Kotlin方面

由于篇幅有限,这里只展示了面试题和部分内容截图,需要完整版《2022中高级 Android 面试必知百题》的朋友可以扫描下方【CSDN官方认证二维码】免费领取!

在这里插入图片描述

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>