赞
踩
SharePreference
用于保存相对较小的键值对数据。
常用于 保存登录信息,引导页状态,设置信息(是否开启通知)状态等。需要注意信息的安全性,不要存储敏感信息,比如用户的账号密码。
sharedPreference
对象SharePreference
保存的文件呢?1.1 声明 sharedPreference
对象
//在 Context 中使用 , 需要传入文件名
val sp = activity?.getSharedPreferences(
"spFileName", Context.MODE_PRIVATE)
//在 Activity 中使用,会默认生成一个和当前 Activity 相关的文件名
val sp = activity?.getPreferences(Context.MODE_PRIVATE)
一般使用 Context 的方式来获取 sharedPreference
对象**
第二个参数是什么意思呢?
@IntDef(flag = true, prefix = { "MODE_" }, value = {
MODE_PRIVATE,//私有文件
MODE_WORLD_READABLE,//可读文件
MODE_WORLD_WRITEABLE,//可读文件
MODE_MULTI_PROCESS,//多进程模式
})
@Retention(RetentionPolicy.SOURCE)
public @interface PreferencesMode {}
目前只有 MODE_PRIVATE 是可用的,其他都弃用了。
**MODE_WORLD_READABLE ,MODE_WORLD_WRITEABLE ** 被 FileProvider 代替
**MODE_MULTI_PROCESS ** 在某些Android版本中不可靠地工作,并且没有提供任何机制来协调跨进程的并发修改。应用程序不应尝试使用它。相反,他们应该使用显式的跨进程数据管理方法,例如 ContentProvider.
1.2 存储数据
2种提交方式
//同步提交,会同步写入磁盘,在需要等待结果的场景可以使用
//避免在主线程调用,它可能会导致页面卡顿
sp.edit().putString(key, value).commit()
//异步提交,会先更新到内存,然后异步存储到磁盘
sp.edit().putString(key, value).apply()
存储数据的类型
String
Int
Boolean
Float
Long
StringSet
1.3 取出数据
//没有存储值的情况下,会返回 defValue
sp.getString(key,defValue)
1.4 删除数据
//清空所有数据
sp.edit().clear()
//移除指定Key的数据
sp.edit().remove(String s)
SharePreference
保存的文件呢?使用 Android Studio 的 Device File Explorer
/data/data/APP包名/shared_prefs/文件名.xml
文件越大,卡顿发生的几率越高
sp 是全量更新的,合并提交可以减少修改的次数
有遇到过缓存整个 list 的 json 存在 sp 文件
SharePreference
适合保存相对较小的键值对数据,不支持多进程。严重时会导致 ANR,注意不要存储大数据。如果需要支持多进程,请使用 DataStore
, 目前 DataStore
基本可以完全取代 SharePreference
。所以这篇文章也是记录 SharePreference
从入门到放弃!
1. commit() 和 apply() 的区别?
2. sharePreference 如何支持多进程?
3. sharePreference 为什么会导致 ANR?
4. 如何解决 sharePreference 的 ANR 问题?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。