SharedPreferences是Android平台上一个轻量级的存储辅助类,用来保存应用的一些常用配置,它提供了string,set,int,long,float,boolean六种数据类型。最终数据是以xml形式进行存储。在应用中通常做一些简单数据的持久化缓存。SharedPreferences作为一个轻量级存储,所以就限制了它的使用场景,如果对它使用不当将会带来严重的后果。
SharedPreferences共有四种操作模式,这四种模式代表的含义为:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
Sp滥用带来的性能问题
1.第一次读取时,造成主线程阻塞(文件过大,主线程等待时间过长),引起ANR
2.文件太大,加载到内存中一直存在,占用大量内存
3.直接在主线程进行commit操作,造成阻塞,引发ANR
4.多次apply,造成锁竞争,浪费系统资源
5.Sp文件过大,每次更新都更新整个文件
Sp最佳实践方案
1.对Sp进行合适的拆分
2.在合适的时机进行异步初始化
3.批量修改一次提交
4.在主线程谨慎使用commit
综合各种特点先将SharedPreferences的使用整理到一起,供讨论,参考:
已有json数据:
- {
- "username": "管理员",
- "rolename": "系统管理员",
- "shuoming": "登录成功.",
- "loginstate": "LOGIN_SUCCESS",
- "userId": "root"
- }
public class DataSaveUtil {
public final static String TAG_USER_DATA = "TpaUserData";
/**
* 保存json数据到共享中
* @param context
* @param jsonObject
*/
public static void saveUserData (Context context, JSONObject jsonObject) {
if (jsonObject == null) {
return;
}
SharedPreferences sp = context.getSharedPreferences(TAG_USER_DATA, Context.MODE_PRIVATE); //
SharedPreferences.Editor editor = sp.edit();
editor.putString("userInfo", jsonObject.toString());
editor.apply(); // 提交保存,commit同步写入,有返回值,但是会造成调用它的线程阻塞,apply异步写入,无返回值!
}
/**
* 获取json数据从共享里
* @param context
* @return
*/
public static JSONObject getUserData (Context context) {
JSONObject jsonObject = null;
try {
SharedPreferences sp = context.getSharedPreferences(TAG_USER_DATA, Context.MODE_PRIVATE);
String strJson = sp.getString("userInfo", "{}");
jsonObject = new JSONObject(strJson);
} catch (Exception e) {
Log.e("myerror", "gesoft", e);
}
return jsonObject;
}
/**
* 清空共享里的数据
* @param context
*/
public static void clearUserData(Context context) {
SharedPreferences sp = context.getSharedPreferences(TAG_USER_DATA, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("userInfo", "{}");
editor.commit();
}
/**
* 快速获取用户id
* @param context
* @return
*/
public static String getUserId(Context context) {
JSONObject jsonObject = getUserData(context);
if (jsonObject != null) {
return jsonObject.optString("userId");
} else {
return "";
}
}
}