SharedPreference ANR优化

本文分析了SharedPreference导致ANR的两个原因,并提出了预加载和分文件存储的解决方案。针对主线程等待子线程写入的问题,通过8.0以下和8.0及以上版本的不同优化策略,实现了避免UI阻塞,确保应用流畅运行。
摘要由CSDN通过智能技术生成

SharedPreference

Google 在设计之初为了方便开发者,实现了一套轻量级的数据持久化方案——SharedPreference(以下简称 sp),因为其简便的 API,方便的使用方式,得到开发者的青睐,对其依赖越来越重。在应用版本不断迭代的过程中发现 Google 说的轻量级的数据存储是有原因的,越是重量级的应用出现的 ANR 问题越严重。

SP 导致 ANR 原因分析

问题1:sp 文件创建以后,会单独的使用一个线程来加载解析对应的 sp 文件。但是当 UI 线程尝试访问 sp 中内容时,如果 sp 文件还未被完全加载解析到内存,此时 UI 线程会被 block,直到 SP 文件被完全加载到内存中为止。

问题2:Google 系统为了确保数据的跨进程完整性,前期应用可以使用 sp 来做跨进程通信,在组件销毁或其他生命周期的同时为了确保当前这个写入任务必须在当前这个组件的生命周期完成写入,此时主线程会在组件销毁或者组件暂停的生命周期内等待 sp 完全写入到对应的文件中,如下图 UI 线程被 block 在了 QueuedWork.waitToFinish()处,
在这里插入图片描述

解决方案:

问题1:针对加载很慢的问题,一般使用的比较多的是采用预加载的方式来触发到这个 sp 文件的加载和解析,这样在真正使用的时候大概率 sp 已经加载解析完毕了;真正需要处理的是核心场景的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值