Android SharedPreferences源码视角

简介

SharedPreferences是Android里最常用的数据持久化方式,其原理是在shared_prefs目录下读写xml文件来存取数据的。关于这块网上的文章很多,我就不重述了。简单列举下我自己画的时序图和一些我的使用建议,最后是容易发生ANR的总结。

时序图

使用建议

  1. getSharedPreferences 首次调用需要做文件操作,比较耗时,不要马上调用edit方法
  2. 将要写入的值一并调用putXXX方法,最后再commit或者apply
  3. commit方法运行在当前调用的线程,如果在主线程调用可能会导致ANR
  4. apply在QueueWork维护的单线程池调用,虽然是异步的但是可能会阻塞Service.onStop和Activity.onPause方法,可能会导致ANR
  5. 不推荐直接在主线程commit, 如果apply的ANR次数过多则有必要采用一个专门的线程用来调用sp的commit方法

ANR容易发生的地方

  1. sp.getXXX, 首先会调用awaitLoadedLocked等待首次sp文件创建与读取操作完成
  2. sp.apply, 虽然是异步但是可能会在Service Activity等生命周期期间mcr.writtenToDIskLatch.await()等待过久
  3. sp.commit 最终会调用 sp.writeToFile方法,很耗时
  4. ContextImpl.getSharedPreferences, 主线程直接调用的话,如果sp文件很大处理时间也就会变长
扫码支持0.99元,您的支持将鼓励我继续创作!