SharedPreferences getSharedPreferences(String name, int mode)
:根据应用名称和文件名获取SharedPreferencesImpl
对象(该类实现了SharedPreferences
接口),如果不存在则直接创建,创建SharedPreferencesImpl
对象的过程是开启线程从硬盘读取文件。String getString(String key, @Nullable String defValue)
:从map中获取value。Editor edit()
:创建EditorImpl
对象(该类实现了Editor
接口),创建一个临时的map用于存储修改的键值对。Editor putString(String key, @Nullable String value)
:往临时的map中插入键值对。boolean commit()
:首先将sp的数据同步到最新状态,然后在当前线程写入文件,通知监听器数据已发生改变,最后返回写操作状态是否成功。void apply()
:和commit主要区别就是apply的写文件操作会在一个线程中执行,不会阻塞UI线程。
commit()和apply()的对比
如果我们使用SharedPreference的apply方法, 虽然该方法可以很快返回,并在其它线程里将键值对写入到文件系统,但是当Activity的onPause/onStop等方法被调用时,会等待写入到文件系统的任务完成,如果写入比较慢,主线程就会出现ANR问题。为了避免出现ANR问题,最好还是别使用apply操作,用commit方法最保险。如果担心在主线程调用commit方法会出现ANR,可以将所有的commit任务放到单线程池的线程里去执行。