说说故事

童话故事|儿童故事|谜语睡前故事|胎教故事|对联

资料学习

作文|范文|医学|留学|教程幼儿|考研|诗词|板报|名言

高考中考

高中|小学初中|大学

学科中心

语文|简谱|化学|政治|历史数学|生物|物理|地理|美术

考试学校

英语|题库|星座学校|高考|中考

SharedPreference性能优化看这一篇就够了

目录

SharedPreference性能优化看这一篇就够了

点击上方蓝字关注?????



来源:? 上帝之手

https://juejin.im/post/5cf7756d6fb9a07eed34edff?utm_source=gold_browser_extension

前言

SharedPreference是Android系统中一种简单的、轻量级的文件存储,它是一种持久化的存储方式,以名称/值对(NVP)机制存放在xml中map根标签下,正如其名,它比较适合一些简单数据的存储,用于保存Int、long、boolean、String、Float、Set这些数据类型,可以在data/data/应用程序/shared_prefs的目录下可以查找到保存的xml文件。

使用方式

1.获取SharedPreference对象

SharedPreferences sp = context.getSharedPreferences(PREFERENCES_NAME,Context.MODE_PRIVATE);

2.获取 SharedPreferences.Editor

SharedPreferences.Editor edit = sp.edit();

3.存储数据

edit.putString(String key,String value);
edit.putStringSet(String key, Set values);
edit.putLong(String key,long value);
edit.putFloat(String key,float value);
edit.putBoolean(String key,boolean value);
edit.putInt(String key,int value);
edit.commit();//同步写入,频繁读取会阻塞主线程,引起ANR
edit.apply();//异步写入,不关心结果,官方推荐,速度与性能较好

4.获取数据

sp.getString(String key,String value);
sp.getStringSet(String key, Set values);
sp.getLong(String key,long value);
sp.getFloat(String key,float value);
sp.getBoolean(String key,boolean value);
sp.getInt(String key,int value);

耗时统计及优化建议

初始化
1.建议在Application中初始化,重写attachBaseContext方法,SharedPreference的context传入Application对象即可,最好使用单例,不必每次都获取Sp对象,减少开销。
2.如果项目中使用了MultiDex,存在分包,请在分包前即MultiDex.install()之前或者在multidex执行的这段时间,cpu是利用不满的,我们没有办法充分利用CPU的原因,是因为如果我们在Multidex之前执行一些操作,我们很有可能因为这样一些操作的类或者是相关的类不在我们的主dex当中,在四点几的类中会直接崩溃,但是由于sharePreference不会产生这种崩溃,是由于他是系统的类。

使用
1.请不要使用SharedPreference存储大文件及存储大量的key和value,这样的话会造成界面卡顿或者ANR比较占内存,记住它是简单存储,如果有类似的需求请考虑数据库、磁盘文件存储等等。
2.推荐使用apply进行存储,这也是官方推荐,当读入内存后,因为它是异步写入磁盘的,所以效率上会比commit好,当然如果你对存储的结果非常关心的话那就使用commit吧。
3.请不要频繁使用apply与commit,如果存在这样的问题,请合并一次性apply与commit,可以参考封装一map的结合,一次性提交,因为SharedPreference可能会存在IO瓶颈和锁性能差的问题。
4.尽量不要存放Json及html,数据少还可以接受,大量的话请放弃。
5.跨进程操作不要使用MULTI_PROCESS标志,而是使用contentprovide等进程间通信的方式。
6.如果你的项目对于存储性能要求非常高的情况,可以考虑放弃系统的SharedPreference存储,可以推荐使用腾讯的高性能组件MMKV,目前超过7k+的star。

封装工具类

封装是基于Blankj的AndroidUtilCode进行的部分改造,增加了提交Map的操作,方便一次性commit与apply,操作时请直接使用SpHelpUtils辅助类。

public class SpHelpUtils {
/**
* 简单存储工具类
*/
private static SpUtils sDefaultSpUtils;

/**
* Set the default instance of {@link SpUtils}.
*
* @param spUtils The default instance of {@link SpUtils}.
*/
public static void setDefaultSpUtils(final SpUtils spUtils) {
sDefaultSpUtils = spUtils;
}

/**
* Put the string value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
*/
public static void put(@NonNull final String key, final String value) {
put(key, value, getDefaultSpUtils());
}

/**
* 提交map,一次性commit,减少频繁读写IO
*
* @param hashmap 存储集合
*/
public static void put(@NotNull final Map hashmap) {
put(hashmap, getDefaultSpUtils());
}


/**
* Put the string value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public static void put(@NonNull final String key, final String value, final boolean isCommit) {
put(key, value, isCommit, getDefaultSpUtils());
}

/**
* 提交map,一次性commit,减少频繁读写IO
*
* @param hashmap 存储集合
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public static void put(final Map hashmap, final boolean isCommit) {
put(hashmap, isCommit, getDefaultSpUtils());
}


/**
* Return the string value in sp.
*
* @param key The key of sp.
* @return the string value if sp exists or {@code ""} otherwise
*/
public static String getString(@NonNull final String key) {
return getString(key, getDefaultSpUtils());
}

/**
* Return the string value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @return the string value if sp exists or {@code defaultValue} otherwise
*/
public static String getString(@NonNull final String key, final String defaultValue) {
return getString(key, defaultValue, getDefaultSpUtils());
}


/**
* Put the int value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
*/
public static void put(@NonNull final String key, final int value) {
put(key, value, getDefaultSpUtils());
}

/**
* Put the int value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public static void put(@NonNull final String key, final int value, final boolean isCommit) {
put(key, value, isCommit, getDefaultSpUtils());
}

/**
* Return the int value in sp.
*
* @param key The key of sp.
* @return the int value if sp exists or {@code -1} otherwise
*/
public static int getInt(@NonNull final String key) {
return getInt(key, getDefaultSpUtils());
}

/**
* Return the int value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @return the int value if sp exists or {@code defaultValue} otherwise
*/
public static int getInt(@NonNull final String key, final int defaultValue) {
return getInt(key, defaultValue, getDefaultSpUtils());
}

/**
* Put the long value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
*/
public static void put(@NonNull final String key, final long value) {
put(key, value, getDefaultSpUtils());
}

/**
* Put the long value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public static void put(@NonNull final String key, final long value, final boolean isCommit) {
put(key, value, isCommit, getDefaultSpUtils());
}

/**
* Return the long value in sp.
*
* @param key The key of sp.
* @return the long value if sp exists or {@code -1} otherwise
*/
public static long getLong(@NonNull final String key) {
return getLong(key, getDefaultSpUtils());
}

/**
* Return the long value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @return the long value if sp exists or {@code defaultValue} otherwise
*/
public static long getLong(@NonNull final String key, final long defaultValue) {
return getLong(key, defaultValue, getDefaultSpUtils());
}

/**
* Put the float value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
*/
public static void put(@NonNull final String key, final float value) {
put(key, value, getDefaultSpUtils());
}

/**
* Put the float value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public static void put(@NonNull final String key, final float value, final boolean isCommit) {
put(key, value, isCommit, getDefaultSpUtils());
}

/**
* Return the float value in sp.
*
* @param key The key of sp.
* @return the float value if sp exists or {@code -1f} otherwise
*/
public static float getFloat(@NonNull final String key) {
return getFloat(key, getDefaultSpUtils());
}

/**
* Return the float value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @return the float value if sp exists or {@code defaultValue} otherwise
*/
public static float getFloat(@NonNull final String key, final float defaultValue) {
return getFloat(key, defaultValue, getDefaultSpUtils());
}

/**
* Put the boolean value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
*/
public static void put(@NonNull final String key, final boolean value) {
put(key, value, getDefaultSpUtils());
}

/**
* Put the boolean value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public static void put(@NonNull final String key, final boolean value, final boolean isCommit) {
put(key, value, isCommit, getDefaultSpUtils());
}

/**
* Return the boolean value in sp.
*
* @param key The key of sp.
* @return the boolean value if sp exists or {@code false} otherwise
*/
public static boolean getBoolean(@NonNull final String key) {
return getBoolean(key, getDefaultSpUtils());
}

/**
* Return the boolean value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @return the boolean value if sp exists or {@code defaultValue} otherwise
*/
public static boolean getBoolean(@NonNull final String key, final boolean defaultValue) {
return getBoolean(key, defaultValue, getDefaultSpUtils());
}

/**
* Put the set of string value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
*/
public static void put(@NonNull final String key, final Set value) {
put(key, value, getDefaultSpUtils());
}

/**
* Put the set of string value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public static void put(@NonNull final String key,
final Set value,
final boolean isCommit)
{
put(key, value, isCommit, getDefaultSpUtils());
}

/**
* Return the set of string value in sp.
*
* @param key The key of sp.
* @return the set of string value if sp exists
* or {@code Collections.emptySet()} otherwise
*/

public static Set getStringSet(@NonNull final String key) {
return getStringSet(key, getDefaultSpUtils());
}

/**
* Return the set of string value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @return the set of string value if sp exists or {@code defaultValue} otherwise
*/
public static Set getStringSet(@NonNull final String key,
final Set defaultValue)
{
return getStringSet(key, defaultValue, getDefaultSpUtils());
}

/**
* Return all values in sp.
*
* @return all values in sp
*/
public static Map getAll() {
return getAll(getDefaultSpUtils());
}

/**
* Return whether the sp contains the preference.
*
* @param key The key of sp.
* @return {@code true}: yes
{@code false}: no
*/

public static boolean contains(@NonNull final String key) {
return contains(key, getDefaultSpUtils());
}

/**
* Remove the preference in sp.
*
* @param key The key of sp.
*/
public static void remove(@NonNull final String key) {
remove(key, getDefaultSpUtils());
}

/**
* Remove the preference in sp.
*
* @param key The key of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public static void remove(@NonNull final String key, final boolean isCommit) {
remove(key, isCommit, getDefaultSpUtils());
}

/**
* Remove all preferences in sp.
*/
public static void clear() {
clear(getDefaultSpUtils());
}

/**
* Remove all preferences in sp.
*
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public static void clear(final boolean isCommit) {
clear(isCommit, getDefaultSpUtils());
}

///////////////////////////////////////////////////////////////////////////
// dividing line
///////////////////////////////////////////////////////////////////////////

/**
* Put the string value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param spUtils The instance of {@link SpUtils}.
*/
public static void put(@NonNull final String key, final String value, @NonNull final SpUtils spUtils) {
spUtils.put(key, value);
}

/**
* 一次性提交
*
* @param map 存储集合
* @param spUtils The instance of {@link SpUtils}.
*/
public static void put(@NonNull final Map map, @NonNull final SpUtils spUtils) {
spUtils.put(map);
}

/**
* Put the string value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
* @param spUtils The instance of {@link SpUtils}.
*/
public static void put(@NonNull final String key,
final String value,
final boolean isCommit,
@NonNull final SpUtils spUtils) {
spUtils.put(key, value, isCommit);
}

/**
* 一次性提交
*
* @param map 存储集合
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
* @param spUtils The instance of {@link SpUtils}.
*/
public static void put(@NonNull final Map map, final boolean isCommit, @NonNull final SpUtils spUtils) {
spUtils.put(map, isCommit);
}

/**
* Return the string value in sp.
*
* @param key The key of sp.
* @param spUtils The instance of {@link SpUtils}.
* @return the string value if sp exists or {@code ""} otherwise
*/
public static String getString(@NonNull final String key, @NonNull final SpUtils spUtils) {
return spUtils.getString(key);
}

/**
* Return the string value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @param spUtils The instance of {@link SpUtils}.
* @return the string value if sp exists or {@code defaultValue} otherwise
*/
public static String getString(@NonNull final String key,
final String defaultValue,
@NonNull final SpUtils spUtils) {
return spUtils.getString(key, defaultValue);
}


/**
* Put the int value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param spUtils The instance of {@link SpUtils}.
*/
public static void put(@NonNull final String key, final int value, @NonNull final SpUtils spUtils) {
spUtils.put(key, value);
}

/**
* Put the int value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
* @param spUtils The instance of {@link SpUtils}.
*/
public static void put(@NonNull final String key,
final int value,
final boolean isCommit,
@NonNull final SpUtils spUtils) {
spUtils.put(key, value, isCommit);
}

/**
* Return the int value in sp.
*
* @param key The key of sp.
* @param spUtils The instance of {@link SpUtils}.
* @return the int value if sp exists or {@code -1} otherwise
*/
public static int getInt(@NonNull final String key, @NonNull final SpUtils spUtils) {
return spUtils.getInt(key);
}

/**
* Return the int value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @param spUtils The instance of {@link SpUtils}.
* @return the int value if sp exists or {@code defaultValue} otherwise
*/
public static int getInt(@NonNull final String key, final int defaultValue, @NonNull final SpUtils spUtils) {
return spUtils.getInt(key, defaultValue);
}

/**
* Put the long value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param spUtils The instance of {@link SpUtils}.
*/
public static void put(@NonNull final String key, final long value, @NonNull final SpUtils spUtils) {
spUtils.put(key, value);
}

/**
* Put the long value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
* @param spUtils The instance of {@link SpUtils}.
*/
public static void put(@NonNull final String key,
final long value,
final boolean isCommit,
@NonNull final SpUtils spUtils) {
spUtils.put(key, value, isCommit);
}

/**
* Return the long value in sp.
*
* @param key The key of sp.
* @param spUtils The instance of {@link SpUtils}.
* @return the long value if sp exists or {@code -1} otherwise
*/
private static long getLong(@NonNull final String key, @NonNull final SpUtils spUtils) {
return spUtils.getLong(key);
}

/**
* Return the long value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @param spUtils The instance of {@link SpUtils}.
* @return the long value if sp exists or {@code defaultValue} otherwise
*/
private static long getLong(@NonNull final String key, final long defaultValue, @NonNull final SpUtils spUtils) {
return spUtils.getLong(key, defaultValue);
}

/**
* Put the float value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param spUtils The instance of {@link SpUtils}.
*/
public static void put(@NonNull final String key, final float value, @NonNull final SpUtils spUtils) {
spUtils.put(key, value);
}

/**
* Put the float value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
* @param spUtils The instance of {@link SpUtils}.
*/
public static void put(@NonNull final String key,
final float value,
final boolean isCommit,
@NonNull final SpUtils spUtils) {
spUtils.put(key, value, isCommit);
}

/**
* Return the float value in sp.
*
* @param key The key of sp.
* @param spUtils The instance of {@link SpUtils}.
* @return the float value if sp exists or {@code -1f} otherwise
*/
private static float getFloat(@NonNull final String key, @NonNull final SpUtils spUtils) {
return spUtils.getFloat(key);
}

/**
* Return the float value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @param spUtils The instance of {@link SpUtils}.
* @return the float value if sp exists or {@code defaultValue} otherwise
*/
private static float getFloat(@NonNull final String key, final float defaultValue, @NonNull final SpUtils spUtils) {
return spUtils.getFloat(key, defaultValue);
}

/**
* Put the boolean value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param spUtils The instance of {@link SpUtils}.
*/
public static void put(@NonNull final String key, final boolean value, @NonNull final SpUtils spUtils) {
spUtils.put(key, value);
}

/**
* Put the boolean value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
* @param spUtils The instance of {@link SpUtils}.
*/
public static void put(@NonNull final String key,
final boolean value,
final boolean isCommit,
@NonNull final SpUtils spUtils) {
spUtils.put(key, value, isCommit);
}

/**
* Return the boolean value in sp.
*
* @param key The key of sp.
* @param spUtils The instance of {@link SpUtils}.
* @return the boolean value if sp exists or {@code false} otherwise
*/
public static boolean getBoolean(@NonNull final String key, @NonNull final SpUtils spUtils) {
return spUtils.getBoolean(key);
}

/**
* Return the boolean value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @param spUtils The instance of {@link SpUtils}.
* @return the boolean value if sp exists or {@code defaultValue} otherwise
*/
public static boolean getBoolean(@NonNull final String key,
final boolean defaultValue,
@NonNull final SpUtils spUtils) {
return spUtils.getBoolean(key, defaultValue);
}

/**
* Put the set of string value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param spUtils The instance of {@link SpUtils}.
*/
public static void put(@NonNull final String key, final Set value, @NonNull final SpUtils spUtils) {
spUtils.put(key, value);
}

/**
* Put the set of string value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
* @param spUtils The instance of {@link SpUtils}.
*/
public static void put(@NonNull final String key,
final Set value,
final boolean isCommit,
@NonNull final SpUtils spUtils)
{
spUtils.put(key, value, isCommit);
}

/**
* Return the set of string value in sp.
*
* @param key The key of sp.
* @param spUtils The instance of {@link SpUtils}.
* @return the set of string value if sp exists
* or {@code Collections.emptySet()} otherwise
*/

private static Set getStringSet(@NonNull final String key, @NonNull final SpUtils spUtils) {
return spUtils.getStringSet(key);
}

/**
* Return the set of string value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @param spUtils The instance of {@link SpUtils}.
* @return the set of string value if sp exists or {@code defaultValue} otherwise
*/
private static Set getStringSet(@NonNull final String key,
final Set defaultValue,
@NonNull final SpUtils spUtils)
{
return spUtils.getStringSet(key, defaultValue);
}

/**
* Return all values in sp.
*
* @param spUtils The instance of {@link SpUtils}.
* @return all values in sp
*/
private static Map getAll(@NonNull final SpUtils spUtils) {
return spUtils.getAll();
}

/**
* Return whether the sp contains the preference.
*
* @param key The key of sp.
* @param spUtils The instance of {@link SpUtils}.
* @return {@code true}: yes
{@code false}: no
*/

public static boolean contains(@NonNull final String key, @NonNull final SpUtils spUtils) {
return spUtils.contains(key);
}

/**
* Remove the preference in sp.
*
* @param key The key of sp.
* @param spUtils The instance of {@link SpUtils}.
*/
public static void remove(@NonNull final String key, @NonNull final SpUtils spUtils) {
spUtils.remove(key);
}

/**
* Remove the preference in sp.
*
* @param key The key of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
* @param spUtils The instance of {@link SpUtils}.
*/
public static void remove(@NonNull final String key, final boolean isCommit, @NonNull final SpUtils spUtils) {
spUtils.remove(key, isCommit);
}

/**
* Remove all preferences in sp.
*
* @param spUtils The instance of {@link SpUtils}.
*/
public static void clear(@NonNull final SpUtils spUtils) {
spUtils.clear();
}

/**
* Remove all preferences in sp.
*
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
* @param spUtils The instance of {@link SpUtils}.
*/
public static void clear(final boolean isCommit, @NonNull final SpUtils spUtils) {
spUtils.clear(isCommit);
}

/**
* 获取简单存储工具类 SpUtils
*
* @return SpUtils
*/
private static SpUtils getDefaultSpUtils() {
return sDefaultSpUtils != null ? sDefaultSpUtils : SpUtils.getInstance(getApplicationByReflect());
}

/**
* 如果你没有初始化该工具类,那么我会通过反射获取当前的applicationContext()
*
* @return Application
*/
private static Application getApplicationByReflect() {
try {
@SuppressLint("PrivateApi")
Class activityThread = Class.forName("android.app.ActivityThread");
Object thread = activityThread.getMethod("currentActivityThread").invoke(null);
Object app = activityThread.getMethod("getApplication").invoke(thread);
if (app == null) {
throw new NullPointerException("u should init first");
}
return (Application) app;
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
throw new NullPointerException("u should init first");
}
}



public class SpUtils {
private static final Map SP_UTILS_MAP = new HashMap<>();
private SharedPreferences sp;

/**
* Return the single {@link SpUtils} instance
*
* @param context context
* @return the single {@link SpUtils} instance
*/
public static SpUtils getInstance(Context context) {
return getInstance(context, "", Context.MODE_PRIVATE);
}

/**
* Return the single {@link SpUtils} instance
*
* @param context context
* @param mode Operating mode.
* @return the single {@link SpUtils} instance
*/
public static SpUtils getInstance(Context context, final int mode) {
return getInstance(context, "", mode);
}

/**
* Return the single {@link SpUtils} instance
*
* @param context context
* @param spName The name of sp.
* @return the single {@link SpUtils} instance
*/
public static SpUtils getInstance(Context context, String spName) {
return getInstance(context, spName, Context.MODE_PRIVATE);
}

/**
* Return the single {@link SpUtils} instance
*
* @param context context
* @param spName The name of sp.
* @param mode Operating mode.
* @return the single {@link SpUtils} instance
*/
public static SpUtils getInstance(Context context, String spName, final int mode) {
if (context == null) {
throw new UnsupportedOperationException("context can"t empty, please init me in SpHelpUtils.class");
}
if (isSpace(spName)) {
spName = context.getPackageName() + "_preferences";
}
SpUtils spUtils = SP_UTILS_MAP.get(spName);
if (spUtils == null) {
synchronized (SpUtils.class) {
spUtils = SP_UTILS_MAP.get(spName);
if (spUtils == null) {
spUtils = new SpUtils(context, spName, mode);
SP_UTILS_MAP.put(spName, spUtils);
}
}
}
return spUtils;
}

private SpUtils(Context context, final String spName) {
sp = context.getSharedPreferences(spName, Context.MODE_PRIVATE);
}

private SpUtils(final Context context, final String spName, final int mode) {
sp = context.getSharedPreferences(spName, mode);
}

/**
* Put the string value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
*/
public void put(@NonNull final String key, final String value) {
// TODO 由于项目的功能需求,这个地方标志位统一改为走commit方式,后期需要逐一优化成apply
put(key, value, true);
}

/**
* 提交Map结合,用于一次性的commit或者apply,减少平凡读写IO
*
* @param map 存储集合
*/
public void put(@NonNull final Map map) {
put(map, true);
}

/**
* Put the string value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public void put(@NonNull final String key, final String value, final boolean isCommit) {
if (isCommit) {
sp.edit().putString(key, value).commit();
} else {
sp.edit().putString(key, value).apply();
}
}

/**
* @param map 存储集合
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public void put(@NonNull final Map map, final boolean isCommit) {
SharedPreferences.Editor edit = sp.edit();
for (Map.Entry next : map.entrySet()) {
if (next.getValue() instanceof String) {
edit.putString(next.getKey(), String.valueOf(next.getValue()));
} else if (next.getValue() instanceof Boolean) {
edit.putBoolean(next.getKey(), (Boolean) next.getValue());
} else if (next.getValue() instanceof Integer) {
edit.putInt(next.getKey(), (Integer) next.getValue());
} else if (next.getValue() instanceof Float) {
edit.putFloat(next.getKey(), (Float) next.getValue());
} else if (next.getValue() instanceof Long) {
edit.putLong(next.getKey(), (Long) next.getValue());
} else {
throw new UnsupportedOperationException("parameter Unsupported type!");
}
}
if (isCommit) {
edit.commit();
} else {
edit.apply();
}
}

/**
* Return the string value in sp.
*
* @param key The key of sp.
* @return the string value if sp exists or {@code ""} otherwise
*/
public String getString(@NonNull final String key) {
return getString(key, "");
}

/**
* Return the string value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @return the string value if sp exists or {@code defaultValue} otherwise
*/
public String getString(@NonNull final String key, final String defaultValue) {
return sp.getString(key, defaultValue);
}

/**
* Put the int value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
*/
public void put(@NonNull final String key, final int value) {
put(key, value, false);
}

/**
* Put the int value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public void put(@NonNull final String key, final int value, final boolean isCommit) {
if (isCommit) {
sp.edit().putInt(key, value).commit();
} else {
sp.edit().putInt(key, value).apply();
}
}

/**
* Return the int value in sp.
*
* @param key The key of sp.
* @return the int value if sp exists or {@code -1} otherwise
*/
public int getInt(@NonNull final String key) {
return getInt(key, -1);
}

/**
* Return the int value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @return the int value if sp exists or {@code defaultValue} otherwise
*/
public int getInt(@NonNull final String key, final int defaultValue) {
return sp.getInt(key, defaultValue);
}

/**
* Put the long value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
*/
public void put(@NonNull final String key, final long value) {
put(key, value, false);
}

/**
* Put the long value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public void put(@NonNull final String key, final long value, final boolean isCommit) {
if (isCommit) {
sp.edit().putLong(key, value).commit();
} else {
sp.edit().putLong(key, value).apply();
}
}

/**
* Return the long value in sp.
*
* @param key The key of sp.
* @return the long value if sp exists or {@code -1} otherwise
*/
public long getLong(@NonNull final String key) {
return getLong(key, -1L);
}

/**
* Return the long value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @return the long value if sp exists or {@code defaultValue} otherwise
*/
public long getLong(@NonNull final String key, final long defaultValue) {
return sp.getLong(key, defaultValue);
}

/**
* Put the float value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
*/
public void put(@NonNull final String key, final float value) {
put(key, value, false);
}

/**
* Put the float value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public void put(@NonNull final String key, final float value, final boolean isCommit) {
if (isCommit) {
sp.edit().putFloat(key, value).commit();
} else {
sp.edit().putFloat(key, value).apply();
}
}

/**
* Return the float value in sp.
*
* @param key The key of sp.
* @return the float value if sp exists or {@code -1f} otherwise
*/
public float getFloat(@NonNull final String key) {
return getFloat(key, -1f);
}

/**
* Return the float value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @return the float value if sp exists or {@code defaultValue} otherwise
*/
public float getFloat(@NonNull final String key, final float defaultValue) {
return sp.getFloat(key, defaultValue);
}

/**
* Put the boolean value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
*/
public void put(@NonNull final String key, final boolean value) {
put(key, value, false);
}

/**
* Put the boolean value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public void put(@NonNull final String key, final boolean value, final boolean isCommit) {
if (isCommit) {
sp.edit().putBoolean(key, value).commit();
} else {
sp.edit().putBoolean(key, value).apply();
}
}

/**
* Return the boolean value in sp.
*
* @param key The key of sp.
* @return the boolean value if sp exists or {@code false} otherwise
*/
public boolean getBoolean(@NonNull final String key) {
return getBoolean(key, false);
}

/**
* Return the boolean value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @return the boolean value if sp exists or {@code defaultValue} otherwise
*/
public boolean getBoolean(@NonNull final String key, final boolean defaultValue) {
return sp.getBoolean(key, defaultValue);
}

/**
* Put the set of string value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
*/
public void put(@NonNull final String key, final Set value) {
put(key, value, false);
}

/**
* Put the set of string value in sp.
*
* @param key The key of sp.
* @param value The value of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public void put(@NonNull final String key,
final Set value,
final boolean isCommit)
{
if (isCommit) {
sp.edit().putStringSet(key, value).commit();
} else {
sp.edit().putStringSet(key, value).apply();
}
}

/**
* Return the set of string value in sp.
*
* @param key The key of sp.
* @return the set of string value if sp exists
* or {@code Collections.emptySet()} otherwise
*/

public Set getStringSet(@NonNull final String key) {
return getStringSet(key, Collections.emptySet());
}

/**
* Return the set of string value in sp.
*
* @param key The key of sp.
* @param defaultValue The default value if the sp doesn"t exist.
* @return the set of string value if sp exists or {@code defaultValue} otherwise
*/
public Set getStringSet(@NonNull final String key,
final Set defaultValue)
{
return sp.getStringSet(key, defaultValue);
}

/**
* Return all values in sp.
*
* @return all values in sp
*/
public Map getAll() {
return sp.getAll();
}

/**
* Return whether the sp contains the preference.
*
* @param key The key of sp.
* @return {@code true}: yes
{@code false}: no
*/

public boolean contains(@NonNull final String key) {
return sp.contains(key);
}

/**
* Remove the preference in sp.
*
* @param key The key of sp.
*/
public void remove(@NonNull final String key) {
remove(key, false);
}

/**
* Remove the preference in sp.
*
* @param key The key of sp.
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public void remove(@NonNull final String key, final boolean isCommit) {
if (isCommit) {
sp.edit().remove(key).commit();
} else {
sp.edit().remove(key).apply();
}
}

/**
* Remove all preferences in sp.
*/
public void clear() {
clear(false);
}

/**
* Remove all preferences in sp.
*
* @param isCommit True to use {@link SharedPreferences.Editor#commit()},
* false to use {@link SharedPreferences.Editor#apply()}
*/
public void clear(final boolean isCommit) {
if (isCommit) {
sp.edit().clear().commit();
} else {
sp.edit().clear().apply();
}
}

private static boolean isSpace(final String s) {
if (s == null) {
return true;
}
for (int i = 0, len = s.length(); i < len; ++i) {
if (!Character.isWhitespace(s.charAt(i))) {
return false;
}
}
return true;
}
}

感谢各位大佬的阅读,如果存在不足的地方或者有更好的建议,请留言回复,我会尽量把文章的质量做到更好以分享给更多的读者,谢谢!

—————END—————

? ? ?

? ?创作不易,点个“在看”

上帝之手

赞赏

长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

SharedPreference性能优化看这一篇就够了最新查阅>>
SharedPreference性能优化看这一篇就够了相关:
发布时间:2019-06-12SharedPreference性能优化看这一篇就够了

点击上方蓝字关注?????来源:? 上帝之手https://juejin.im/post/5cf7756d6fb9a07eed34edff?utm_source=gold_browser_extension前言SharedPreference是Android系统中一种简单的、轻量级的文件存储,它是一种持久化的存储方式,以名称/值对(NVP)机制存放在xml..

发布时间:2019-06-12别乱看,散户复盘看这4点就够了!(非常实用)

1、大盘分析指数的运行趋势、相对位置的高低、重要支撑与压力、均线系统和成交量等情况,投资者要善于审时夺势,养成良好的大局观,只有看清形势,掌握正确的方向,才会做到事半功倍,不至于犯系统性错误。具体体现为分析大盘至少一年以上的走势,为什么一年以上呢?很多人都喜欢把K线放得很大,整个软件界面不过就显示那几根K线,请问你能看什么?但是,如果把K线缩小成下图的样子..

发布时间:2019-06-12VALSE?Webinar活动CVPR会议期间暂停通知

?端午安康由于CVPR大会临近,webinar活动暂停两周:6月12日、6月19日,下期活动的时间是:6月26日。VALSE在这里祝大家端午安康!VALSE赞赏长按二维码向我转账受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

发布时间:2019-06-12中国品牌需要性能车

文| 阑珊中国品牌需要性能车吗?如果你把这个问题抛给一个中国人,十有八九会得到两种非常极端的回答。一说不需要。在他们看来,中国人对汽车的认知程度有限,他们中的大多数其实根本不懂什么是性能,买车一味只追求舒适度和性价比,所以性能车在中国根本无法走量,对车企销量没有意义。一说需要。因为他们认为,一个真正的汽车品牌,性能才是其技术与灵魂的象征,所以拥有一款自主研..

发布时间:2019-06-12与小Z一起学自控——典型实例帮你理解FC与FO、NC与NO

点击 《福利来了!PLC的资料(免费),你要吗?》点击《第二波福利来了!PLC的资料(免费),你要吗?》FC (Fail Close )与FO(Fail Open)?FC与FO多用于两位式开关阀门,既当供气(供电)系统故障时,阀门要求到达对系统安全的位置。那么怎样才叫系统安全位置,一旦事故状态出现(停气、停电),阀门应处于开位置还是关位置呢?看了下面的图的..

发布时间:2019-06-12CES现场丨福特与百度携手推出SYNC+,智联车机本土化决定车企未来

6月10日,福特中国在上海举办了“SYNC+四重奏”媒体沙龙活动,从技术层面对SYNC+系统进行了解析,并现场演示SYNC+四大功能亮点。在今天(6月11日)开幕的CES Asia展会上,搭载了SYNC+系统的福特锐界ST也进行了现场展示。文丨AutoR智驾 长金福特在传统车企中一直是那个最早宣称向移动出行公司转型的先知先觉者。但似乎也正因如此,它在转型之..

发布时间:2019-06-12讯石专访 | 浙江光特:25G PIN和4X25G PIN Array已具备批量能力,正面迎接高端市场需求增长

导读 浙江光特科技正式宣布,其25G PIN和4x25G PIN Array已通过客户认可,实现了小批量出货,并具备大批量供应的能力。浙江光特创始人叶瑾琳博士表示,浙江光特经过数年时间的研发积累,在高速光器件需求爆发的节点上,已经做好为市场供应国产高端光芯片的出货准备,配合5G商用系统的部署和数据中心的建设。 ICCSZ讯随着互联网流量剧增驱动光纤通..

发布时间:2019-06-12美国前州长兼哈佛研究员MrShumlin到访,新通教育总裁麻亚炜接待

2019年3月,美国佛蒙特州第81任州长Mr. Peter Shumlin与新通教育集团总裁麻亚炜女士在杭州就教育国际化问题进行了会面交流。-上图左侧为新通教育集团总裁麻亚炜女士-右侧为美国佛蒙特州第81任州长兼哈佛大学研究员和讲师的Mr. Peter Shumlin双方在培养和提升学生核心竞争力的方面进行了深刻的探讨,在学生的社会实践教育,世界名校申请,..

发布时间:2019-06-12RedVelvet将举行回归纪念showcase;2PM黄灿盛今日入伍

·RedVelvet将举行回归纪念showcase·▼Red Velvet为了纪念新迷你专辑《The ReVe Festival》发售,将于6月19日晚上8点在首尔龙山区举行showcase,与粉丝们度过特别的时间。特别是Red Velvet在此次Showcase上不仅将首次公开主打曲《Zimzalabim》的舞台,还计划向粉丝们讲述关于新迷你专辑的各种故..

发布时间:2019-06-12Spring?Boot?+?Vue?+?Shiro?实现前后端分离、权限控制

点击上方“芋道源码”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏?中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业调度中间件 Elastic-Job 源码解析分布式事务中间件 TCC-Trans..

发布时间:2019-06-12周华健29岁混血儿子近照,继承父母好长相,这一点像极了爸爸

要说起周华健,那绝对是很多人的童年记忆,他的许多歌都非常经典,像《亲亲我的宝贝》《朋友》《其实不想走》《真心英雄》《最近比较烦》等等,时隔多年还是能够哼唱出来。如今已经59岁的周华健,仍然活跃在舞台上,之前在《中国好声音》这档节目中当导师,风采依旧,今年央视春晚,还和任贤齐一起演唱了那曲非常经典的《朋友》,又是一波回忆杀。周华健的妻子康粹兰,是一名美国人,..

发布时间:2019-06-12Rencontres?▏央视法语对话栏目?苏菲玛索专访,法语听说练习!

点击上方“环球法语” 可以订阅哦!点一下你会更好看耶赞赏长按二维码向我转账受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

发布时间:2019-06-12明明是3根香蕉和2个苹果,为啥用that?

微友提问凌哥,您好,请问四年级下册Recycle 2中,图2中Amy提问的是Three bananas and two apples, please. 为什么用How much is that ? 而不是 How much are they?谢谢!您好!两者都是可以的,语法上更没有错误。只是在语用上,说话者思考的角度不同。使用How much are th..

发布时间:2019-06-12《看这壮观的祖国》

我走遍祖国山山水水,我爱这壮观美丽的家园,我崇拜我的国家,是她给了我的人生和一切,富饶的自然景色,多彩的山河风貌,使我如此陶醉和迷恋,山川的水流飞瀑,云端中蓝色天空,汇映着我美丽祖国的容貌,简直如神话中的仙境,时刻飘舞在华厦上空,70年的光輝和巨变,如动人的自然小说,描绘着时代变化和成就,有坎坷曲折艰险和困境,如此多变中寻找幸福路,用鲜血生命和人生灵魂,谱..

发布时间:2019-06-12如何用?EndNote?轻松自定义杂志要求的文献格式?

欢迎分享本文到朋友圈~~(来源:微算云平台、丁香园←关注它)EndNote 软件是使用频率比较高的文献管理软件,它可以帮助科研达人节省不少时间;当我们写的文章投稿进入返修时,各位高深的编辑就会要求按照他们杂志社出版要求进行格式修改,对于引用文献的格式修改有时难免头大。强烈推荐Endnote史上最全视频+图文使用教程Endnote X9下载及安装那么,如何快..

发布时间:2019-06-12我忙着去餐饮店做服务员?|?MoreYeah·无野月刊

图片来自朋友圈滤镜摄影达人@强悍的feel先生-6月1日,儿童节,「无野」的第60天,我们又忙又充实,所以文章晚了2天发。网上看到一句话,说「废掉1个人最好的的方式,是让他忙到没时间成长」,竟然莫名其妙就10万+阅读。?其实,我不认可这句话,甚至说,这句话是个很矛盾的伪命题。换句话说,我如果忙着成长呢,或者忙着赚钱呢?所谓「忙」,就是一种付出,付出时间、心..

发布时间:2019-06-12看看这种日本沙雕广告,我不能一个人瞎啊!。

这个广告,10秒就一个笑点,根本来不及喘气又要开始笑了!剧情包括小三,小四,三角恋,四角恋,各种峰回路转的套路!绝对比一部电视剧精彩!最重要的是,你根本猜不到它要卖什么产品啊!好了。可以开始笑了!最要命的是最后一个!!!谁TM猜得到啊!可以说是年度神广告了!这样的广告,我当然不能一个人瞎,大家一起瞎吧!!哈哈哈哈哈哈哈哈哈!----------------..

发布时间:2019-06-12期末考快到了,快看看这些孩子为了敷衍作业,都有哪些‘骚操作’,老师:一般人做不来!

现在孩子的小脑瓜都越来越灵活了,不知道脑子都在想些什么,就连专业也是奇葩的让人哭笑不得。尤其是小学生这个特殊的年纪了,刚刚开始步入学习生活中,脑子里的想法千奇百怪,对各种事物的看法独树一帜,于是就写出了各种千奇百怪的作业,下面就让柑果老师带大家来看看这些古灵精怪的孩子们写的奇葩作业吧!老师:一般人是做不出来的!page1这位同学写的运用词语造句。这各位同学..

发布时间:2019-06-12LED照明灯具常见问题及解答

一、LED灯具基本与以下几点技术相关事项①、LED灯珠是高科技产物,生产所需的设备要求很高,因此低端的技术是生产不出高端的产品;②、驱动电源的生产要求也是很高的,因为LED使用寿命长,基本上坏的都是驱动电源比较多,因此好的驱动电源才能保持长久高效地照明;③、散热材料的使用以及产品封装的工艺也非常重要,LED灯珠太热容易照成灯珠地损坏,因此散热工艺必须做好!..

发布时间:2019-06-12你好,我被在网上申请贷款被骗了7000多,一会交这一会交那的,我的钱还能要回来吗?

18万专业律师任您选和律师直接通话百万知识随手查解读社会热点中国刑法罪名大全合同范本大全不好要回了。

百度SharedPreference性能优化看这一篇就够了:

栏目推荐
热点排行
推荐阅读