App 性能优化
RecyclerView
1、onBindViewHolder 运行在 UI 线程,不宜进行逻辑等耗时操作,只适合把数据填入视图;
2、使用 support 包下面的 DiffUtil 局部刷新处理,DiffUtil(内部也是调用局部刷新方法)可以对比数据的差异,是否更改;
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffCallBack(oldDatas, newDatas), true);
diffResult.dispatchUpdatesTo(mAdapter); 计算在主线程,如果数据量大需要放在线程中,通过 Handler 更新。
3、给可以复用 holder 的 RecyclerView 设置相同的 holder pool,在相同视图中,不会重新创建 holder;
RecyclerView recyclerView = new RecyclerView(context);
//layoutManager.setRecycleChildrenOnDetach(true);//LinearLayoutManager 需要额外设置
recyclerView.setRecycledViewPool(mPool); 4、数据缓存,直接加载网络数据延迟比较重,加载缓存中的数据;
5、优化代码,尽量减少对象的创建,复用对象资源,比如监听;
6、getExtraLayoutSpace 预加载,RecyclerView 只缓存可见 view,滑动时初次加载会导致延迟卡顿,可以使用预加载处理,改变加载的滑动范围;
7、嵌套 RecyclerView 时,通过 setInitialPrefetchItemCount 设置首次显示个数,只有在嵌套且横向列表才生效;
黑白屏系统加载 app 时,会先显示一个空白页,空白页背景色从应用主题中获取,一般默认是白色。 1、通过给启动页单独设置主题背景或颜色来避免,否则每个活动都会设置成一样的启动图片。设置背景颜色透明,如果启动的活动耗时长,会导致启动卡顿,需要避免启动活动的耗时操作;
设置背景图片,需要引入多张图片来做屏幕适配,而且无法适配所有屏幕,所以一般使用 LayerDrawable,然后引入资源图片,通过设置偏移量等参数达到适配效果。 2、减少 Application 耗时任务。把一些非必要的第三方等操作单独初始化,比如 IntentService。 app 启动页优化
apk 体积优化
布局优化
1、减少层次嵌套;
2、减少重复绘制,可以通过系统设置中打开 Show GPU Overdraw 设置查看,红色表示需要优化;
3、使用 include(复用布局)、merge(减少嵌套)、ViewStub(按需求加载,只能执行一次)。
包体积优化
1、使用 tint 避免多次导入资源;
2、资源配置,ndk、resConfigs、代码混淆等;
3、删除无引用资源。
ANR 处理
发生 ANR 时, 系统会在 /data/anr/ 目录下生成一个 traces.txt 文件,可以通过 adb 命令将其导出到本地查看,一般的 ANR 都能定位到具体类。
1、iowait
日志中显示 CPU 占用情况,其中 io 占用大部分,表示有频繁的读写(数据库、文件)操作;
2、dalvik threads free
显示内存不够,一般会触发 oom 异常。
网络优化
1、减少调用次数跟发送和接收数据包的大小,Android Studio 内置 Monitor 工具,可以查看接收和发送速度;
2、网络缓存;
3、七牛资源图片等加载适合的资源,比如压缩图。
|