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。

以上是目前想到的,以后有补充在陆续更新修改本文。

(0)

相关推荐