列表页卡顿
常规方案
convertView复用、使用ViewHolder
耗时任务异步处理
升级方案
布局相关
图片相关
避免过大尺寸:GC频繁、内存抖动
滑动时取消加载显示
图片不应该超过控件大小
线程相关
TextView优化
背景
原因:面对复杂文本性能不佳
BoringLayout单行、StaticLayout多行
DynamicLayout可编辑
优化
展示类StaticLayout即可,性能优于DynamicLayout
异步创建StaticLayout
facebook/TextLayoutBuilder
存储优化
SharePreferences
- 加载慢:初始化加载整个文件(加载在异步线程中进行,取值会等待加载完成,取值在主线程会出现主线程等待异步线程的情况,导致UI线程阻塞)
- 全量写入:单次改动都会导致整体写入
- 卡顿:补偿策略导致(提供了apply异步写sp,程序异常或其他情况可能导致数据丢失,所以每次有系统消息发生的时候(handleStopActivity, handlePauseActivity),都会去检查已经提交的apply写操作是否完成,如果没有完成则阻塞主线程)
MMKV
- mmap和文件锁保证数据完整
- 增量写入、使用Protocol Buffer
- 支持从SharePreferences迁移
日志
- 大量服务需要日志库支持
- 对于性能的要求:不影响性能、日志不丢失、安全
常规方案
- 每产生一个日志,写一遍到磁盘中:不丢失、性能损耗
- 开辟一个内存buffer,先存buffer,再存文件:丢日志
mmap
- 内存映射文件
- 优势:高性能、不丢失
- 业界实现:Xlog、Logan