Android面试-App性能优化
Android面试基本绕不开App性能优化,在内存和App的运行速度上我根据个人想到的做一个汇总总结。
内存方面
一:内存泄漏
不需要再使用的对象被其它对象持有引用,导致该对象所占用的内存不能被回收,这就是内存泄漏。
二:内存溢出
一个应用内的内存耗尽,无法为新对象分配内存,导致应用崩溃,这就是内存溢出,典型是加载多张大图,内存泄漏可以造成内存溢出后果。
如何解决Bitmap 内存溢出?
可以对图片进行采样率、RGB565压缩、尺寸等压缩法,如有需要可以加入LruCache 对图片进行缓存管理。
什么情况下会造成内存泄漏?
长期保持某些资源,如Context、Cursor、IO流的引用,资源得不到释放造成内存泄露。
1.Context 对象被其它地方引用,没有被释放。
2.查询数据库没有关闭cursor 。
3.Adapter没有复用convertView,没有使用 ViewHolder模式。
4.Bitmap 不再使用时 没有调用recylce()释放内存。
5.Handler造成的内存泄漏
UI性能。
1.不要在UI 线程做耗时操作,导致UI线程卡顿。
2.Layout的层次太多,无法再16ms内完成渲染。
3.viewStub 减少过度绘制,使用时再初始化。
4.同一时间做过多的动画。
APP冷启动.
Application是自行开发程序的主入口,特别是很多第三方SDK都会需要在Application的onCreate里面做很多初始化操作。一些第三方框架的sdk能在子线程中初始化则就在子线程中去初始化。
总结
1.布局排版上,如图片与文字,能利用用TextView属性就不需要用Layout 包裹ImageView 和TextView 来实现, 如直接用TextView的drawableLeft,或者drawableTop
2.Bitmap的内存处理,1. 采样率压缩: Bitmap在设置给ImageView的时候,把图片宽高压到与ImageView的大小一致2.如果图片没有透明的部分优先考虑 Config.RGB_565,内存直接比默认配置少一半。
3.Fragment尽量使用懒加载的形式,尤其是放在ViewPager 中使用。A—跳到B Activity, 如果B Activity 有ViewPager 加载Fragment,Fragment 有耗时操作就容易出现卡顿,因为B Activity 的onCreated 函数有耗时操作。
4.可以采用ArrayMap等新的轻型结构代替java 包中的传统结构类型。
5.可以使用EventBus 代替广播。
6.大文件操作可以使用nio 中的 FileChannel 配置ByteBuffer 高效率读写。
7.application中的某些初始化能放到子线程中的可以放到子线程中进行。
8.多利用AndroidStudio 自带的Lint 工具,对工程进行分析 inspectCode,自带内存监控,也可以使用第三方的内存监控工具LeakCanary。
以上是目前想到的,以后有补充在陆续更新修改本文。