Sharepreferences原理总结

  1. SharedPreferences getSharedPreferences(String name, int mode):根据应用名称和文件名获取SharedPreferencesImpl对象(该类实现了SharedPreferences接口),如果不存在则直接创建,创建SharedPreferencesImpl对象的过程是开启线程从硬盘读取文件。
  2. String getString(String key, @Nullable String defValue):从map中获取value。
  3. Editor edit():创建EditorImpl对象(该类实现了Editor接口),创建一个临时的map用于存储修改的键值对。
  4. Editor putString(String key, @Nullable String value):往临时的map中插入键值对。
  5. boolean commit():首先将sp的数据同步到最新状态,然后在当前线程写入文件,通知监听器数据已发生改变,最后返回写操作状态是否成功。
  6. void apply():和commit主要区别就是apply的写文件操作会在一个线程中执行,不会阻塞UI线程。

commit()和apply()的对比

如果我们使用SharedPreference的apply方法, 虽然该方法可以很快返回,并在其它线程里将键值对写入到文件系统,但是当Activity的onPause/onStop等方法被调用时,会等待写入到文件系统的任务完成,如果写入比较慢,主线程就会出现ANR问题。为了避免出现ANR问题,最好还是别使用apply操作,用commit方法最保险。如果担心在主线程调用commit方法会出现ANR,可以将所有的commit任务放到单线程池的线程里去执行。

0%