对SharedPreference理解和使用

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数据:

  1.      {
  2.              "username": "管理员",
  3.              "rolename": "系统管理员",
  4.              "shuoming": "登录成功.",
  5.              "loginstate": "LOGIN_SUCCESS",
  6.              "userId": "root"
  7.       }
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 "";
        }
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值