Android中高级进阶开发面试题冲刺合集(四)

以下主要针对往期收录的面试题进行一个分类归纳整理,方便大家统一回顾和参考。本篇是第四集~

强调一下:因篇幅问题:文中只放部分内容,全部面试开发文档需要的可在公众号获取或找作者领取。

第一篇面试题在这: Android中高级进阶开发面试题冲刺合集(一)

第二篇面试题在这: Android中高级进阶开发面试题冲刺合集(二)

第三篇面试题在这: Android中高级进阶开发面试题冲刺合集(三)

Android 性能调优相关

1.谈谈你对Android性能优化方面的了解?

参考答案:

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

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

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

  • 性能优化,网络优化,电量优化

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

    • 循环尽量不使用局部变量
    • 避免在onDraw中创建对象,onDraw会被频繁调用,容易造成内存抖动。循环中创建大的对象,也是如此。
    • 不用的对象及时释放
    • 数据库的cursor及时关闭
    • adapter使用缓存
    • 注册广播后,在生命周期结束时反注册
    • 及时关闭流操作
    • 图片尽量使用软引用,较大的图片可以通过bitmapFactory缩放后再使用,并及时recycler。另外加载巨图时不要 使用setImageBitmap或setImageResourse或BitmapFactory.decodeResource,这些方法拿到的都是bitmap的对象,占用内存较大。可以用BitmapFactory.decodeStream方法配合BitmapFactory.Options进行缩放
    • 避免static成员变量引用资源耗费过多实例
    • 避免静态内部类的引用

2.一般什么情况下会导致内存泄漏问题?如何解决

参考答案:

  1. 资源对象没关闭造成的内存泄漏(如: CursorFile等)
  2. Bitmap 对象不在使用时调用recycle()释放内存
  3. 集合中对象没清理造成的内存泄漏(特别是 static 修饰的集合)
  4. 接收器、监听器注册没取消造成的内存泄漏
  5. ActivityContext 造成的泄漏,可以使用 ApplicationContext
  6. Handler 造成的内存泄漏问题(一般由于 Handler 生命周期比其外部类的生命周期长引起的)

3.自定义 Handler 时如何有效地避免内存泄漏问题?

参考答案:

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

4.哪些情况下会导致OOM问题?如何解决?

参考答案:

1,过多的内存泄漏会导致内存溢出 2,加载大的图片 3,创建过多的线程

内存优化的解决方法: 1.申请更大的内存,比如多进程、设置manifest中的largeHeap=true等。 2.减少内存使用 ①使用优化后的集合对象,分场景使用SpaseArray和HashMap; ②使用微信的mmkv替代sharedpreference; ③使用StringBuilder替代String拼接 ④统一带有缓存的基础库,特别是图片库,如果用了两套不一样的图片加载库就会出现2个图片各自维护一套图片缓存 ⑤给ImageView设置合适尺寸的图片,列表页显示缩略图,查看大图显示原图 ⑥优化业务架构设计,比如省市区数据分批加载,需要加载省就加载省,需要加载市就加载失去,避免一下子加载所有数据 3.避免内存泄漏

5.ANR 出现的场景以及解决方案?

参考答案:

场景: 1、触摸无响应5s 2、BroadCastReciver 前台处理超过10s 后台超过60s 3、Server 前台处理超过20s 后台超过200s

ANR出现的类型有两种 1、主线程耗时导致 2、CPU、内存、IO 占用过高资源耗尽(其他进程也可以导致)

如何避免: 1、不要在主线程中做耗时的操作 2、避免CPU占用过高,简化方法,减少执行时间 3、避免内存占用过高,防止内存泄漏

6.谈谈 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中高级进阶开发面试题冲刺合集(四)_第1张图片

7.谈谈布局优化的技巧?

参考答案:

1.减少过度绘制,减少不必要的背景绘制,线性,相对,约束层级一样的用线性,层级多的用相对或者约束来控制,减少层级 2.减少布局深层次嵌套,配合merge,include,viewStub,约束布局这些来减少布局的开销 3.尽量减少控件个数,对 TextView 左边或者右边有图片可是试用 drawableLeft,drawableRight 4.熟悉API尽量借助系统现有的属性来实现一些UI效果 5.对于 ImageVIew 通过imageDrawable方法进行设置避免ImageView的background和imageDrawable重叠 6.使用Canvas的clipRect和clipPath方法限制View的绘制区域

8.对于 Android 中图片资源的优化方案你知道哪些?

参考答案:

首先我们可以对图片进行二次采样,从本质上减少图片的内存占用。就是将大图片缩小之后放入到内存中,以实现减小内存的目的 2.其次就是采用三层缓存架构,提高图片的访问速度。三层缓存架构是内存-文件-网络。

内存是访问速度最快的部分但是分配的空间有限,所以不可能占用太多。其中内存缓存可以采用LRU算法(最近最少使用算法),来确定要删除内存中的那些图片,保存那

些图片。

文件就是将图片保存到本地,可以使SD卡中,也可以是手机内部存储中。

网络就是访问网络下载图片,进行图片的加载。 3.常见的png,JPG,webp等格式的图片在设置到UI上之前需要经过解码过程,而图片采用不同的码率,也会造成对内存的

你可能感兴趣的:(android,面试,职场和发展,java,Framework)