1. package com.zhy.utils;
  2.  
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;
  5. import java.util.Map;
  6.  
  7. import android.content.Context;
  8. import android.content.SharedPreferences;
  9.  
  10. public class SPUtils
  11. {
  12. /**
  13. * 保存在手机里面的文件名
  14. */
  15. public static final String FILE_NAME = "share_data";
  16.  
  17. /**
  18. * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
  19. *
  20. * @param context
  21. * @param key
  22. * @param object
  23. */
  24. public static void put(Context context, String key, Object object)
  25. {
  26.  
  27. SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
  28. Context.MODE_PRIVATE);
  29. SharedPreferences.Editor editor = sp.edit();
  30.  
  31. if (object instanceof String)
  32. {
  33. editor.putString(key, (String) object);
  34. } else if (object instanceof Integer)
  35. {
  36. editor.putInt(key, (Integer) object);
  37. } else if (object instanceof Boolean)
  38. {
  39. editor.putBoolean(key, (Boolean) object);
  40. } else if (object instanceof Float)
  41. {
  42. editor.putFloat(key, (Float) object);
  43. } else if (object instanceof Long)
  44. {
  45. editor.putLong(key, (Long) object);
  46. } else
  47. {
  48. editor.putString(key, object.toString());
  49. }
  50.  
  51. SharedPreferencesCompat.apply(editor);
  52. }
  53.  
  54. /**
  55. * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
  56. *
  57. * @param context
  58. * @param key
  59. * @param defaultObject
  60. * @return
  61. */
  62. public static Object get(Context context, String key, Object defaultObject)
  63. {
  64. SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
  65. Context.MODE_PRIVATE);
  66.  
  67. if (defaultObject instanceof String)
  68. {
  69. return sp.getString(key, (String) defaultObject);
  70. } else if (defaultObject instanceof Integer)
  71. {
  72. return sp.getInt(key, (Integer) defaultObject);
  73. } else if (defaultObject instanceof Boolean)
  74. {
  75. return sp.getBoolean(key, (Boolean) defaultObject);
  76. } else if (defaultObject instanceof Float)
  77. {
  78. return sp.getFloat(key, (Float) defaultObject);
  79. } else if (defaultObject instanceof Long)
  80. {
  81. return sp.getLong(key, (Long) defaultObject);
  82. }
  83.  
  84. return null;
  85. }
  86.  
  87. /**
  88. * 移除某个key值已经对应的值
  89. * @param context
  90. * @param key
  91. */
  92. public static void remove(Context context, String key)
  93. {
  94. SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
  95. Context.MODE_PRIVATE);
  96. SharedPreferences.Editor editor = sp.edit();
  97. editor.remove(key);
  98. SharedPreferencesCompat.apply(editor);
  99. }
  100.  
  101. /**
  102. * 清除所有数据
  103. * @param context
  104. */
  105. public static void clear(Context context)
  106. {
  107. SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
  108. Context.MODE_PRIVATE);
  109. SharedPreferences.Editor editor = sp.edit();
  110. editor.clear();
  111. SharedPreferencesCompat.apply(editor);
  112. }
  113.  
  114. /**
  115. * 查询某个key是否已经存在
  116. * @param context
  117. * @param key
  118. * @return
  119. */
  120. public static boolean contains(Context context, String key)
  121. {
  122. SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
  123. Context.MODE_PRIVATE);
  124. return sp.contains(key);
  125. }
  126.  
  127. /**
  128. * 返回所有的键值对
  129. *
  130. * @param context
  131. * @return
  132. */
  133. public static Map<String, ?> getAll(Context context)
  134. {
  135. SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
  136. Context.MODE_PRIVATE);
  137. return sp.getAll();
  138. }
  139.  
  140. /**
  141. * 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类
  142. *
  143. * @author zhy
  144. *
  145. */
  146. private static class SharedPreferencesCompat
  147. {
  148. private static final Method sApplyMethod = findApplyMethod();
  149.  
  150. /**
  151. * 反射查找apply的方法
  152. *
  153. * @return
  154. */
  155. @SuppressWarnings({ "unchecked", "rawtypes" })
  156. private static Method findApplyMethod()
  157. {
  158. try
  159. {
  160. Class clz = SharedPreferences.Editor.class;
  161. return clz.getMethod("apply");
  162. } catch (NoSuchMethodException e)
  163. {
  164. }
  165.  
  166. return null;
  167. }
  168.  
  169. /**
  170. * 如果找到则使用apply执行,否则使用commit
  171. *
  172. * @param editor
  173. */
  174. public static void apply(SharedPreferences.Editor editor)
  175. {
  176. try
  177. {
  178. if (sApplyMethod != null)
  179. {
  180. sApplyMethod.invoke(editor);
  181. return;
  182. }
  183. } catch (IllegalArgumentException e)
  184. {
  185. } catch (IllegalAccessException e)
  186. {
  187. } catch (InvocationTargetException e)
  188. {
  189. }
  190. editor.commit();
  191. }
  192. }
  193.  
  194. }

对SharedPreference的使用做了建议的封装,对外公布出put,get,remove,clear等等方法;

注意一点,里面所有的commit操作使用了SharedPreferencesCompat.apply进行了替代,目的是尽可能的使用apply代替commit

首先说下为什么,因为commit方法是同步的,并且我们很多时候的commit操作都是UI线程中,毕竟是IO操作,尽可能异步;

所以我们使用apply进行替代,apply异步的进行写入;

但是apply相当于commit来说是new API呢,为了更好的兼容,我们做了适配;

SharedPreferencesCompat也可以给大家创建兼容类提供了一定的参考~~

Android常用的工具类SharedPreferences封装类SPUtils的更多相关文章

  1. Android常用的工具类

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java.目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils. Prefe ...

  2. Android常用的工具类(转)

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java.目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.Prefer ...

  3. 2013最新Android常用的工具类整理

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils. Pref ...

  4. Android常用正则工具类

    此类提供日常开发中常用的正则验证函数,比如:邮箱.手机号.电话号码.身份证号码.日期.数字.小数.URL.IP地址等.使用Pattern对象的matches方法进行整个字符匹配,调用该方法相当于:   ...

  5. Android开发之常用必备工具类图片bitmap转成字符串string与String字符串转换为bitmap图片格式

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...

  6. (转载)实例详解Android快速开发工具类总结

    实例详解Android快速开发工具类总结 作者:LiJinlun 字体:[增加 减小] 类型:转载 时间:2016-01-24我要评论 这篇文章主要介绍了实例详解Android快速开发工具类总结的相关 ...

  7. Android 软件管理工具类Utils

    Android 软件管理工具类Utils /** * Created by uilubo on 2015/9/30. * 工具类 */ public class Utils { public stat ...

  8. 一个使用命令行编译Android项目的工具类

    一个使用命令行编译Android项目的工具类 简单介绍 编译apk项目须要使用的几个工具,基本都在sdk中,它们各自是(Windows系统): 1.aapt.exe 资源打包工具 2.android. ...

  9. Java语言Lang包下常用的工具类介绍_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 无论你在开发哪中 Java 应用程序,都免不了要写很多工具类/工具函数.你可知道,有很多现成的工具类可用,并且代码质量都 ...

随机推荐

  1. 轴对称 Navier-Stokes 方程组的点态正则性准则 II

    在 [Wei, Dongyi. Regularity criterion to the axially symmetric Navier-Stokes equations. J. Math. Anal ...

  2. 项目实战 redis 缓存

    1 首先在你的项目中,引用以下ServiceStack.Redis相关的四个类库.或者通过Nuget进行安装Redis常用组件ServiceStack.Redis. 下载示例代码. 2. 创建一个Re ...

  3. luogu P5287 [HNOI2019]JOJO

    传送门 神™这题暴力能A,这出题人都没造那种我考场就想到的数据,难怪我的垃圾做法有分 先考虑没有撤销操作怎么做,因为每次插入一段一样的字符,所以我们可以把\(x\)个字符\(c\)定义为\(cx\), ...

  4. 4.Centos7安装JDK8以及环境配置

    1.下载 linux 版本 jdk (jdk-8u11-linux-x64.tar.gz) 一定要是 .tar.gz 版本,可以去我的百度网盘下载或者在百度上面找 2.新建文件夹命令:mkdir /u ...

  5. 51nod 1228、1258 序列求和

    这里一次讲两题...貌似都是板子? 所以两题其实可以一起做 [雾 noteskey 总之就是伯努利数的两道入门题啦,就是第二道有点鬼畜了,居然要任意模数的!(好吧是 1e9+7 但也没什么区别了) 伯 ...

  6. ALU底层方法及计算机整数加减乘除模拟

    ALU是计算机CPU的核心,即 算术逻辑单元(arithmetic and logic unit)ALU有几大功能,是计算机计算最基础的功能:1.算术运算:包含加法.减法等2.逻辑运算:主要是布尔运算 ...

  7. CentOS7.6 yum方式安装mysql2.7.25

    在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB 1 下载并安装MySQL官方的 Yum Rep ...

  8. 使用CompletionService结合ExecutorService批处理调用存储过程任务实例

    此实例为java多线程并发调用存储过程实例,只做代码记载,不做详细描述 1.线程池构造初始化类CommonExecutorService.java package com.pupeiyuan.go; ...

  9. 论文阅读笔记四十三:DeeperLab: Single-Shot Image Parser(CVPR2019)

    论文原址:https://arxiv.org/abs/1902.05093 github:https://github.com/lingtengqiu/Deeperlab-pytorch 摘要 本文提 ...

  10. 关于pyCharm专业版的破解方法

    用pycharm编写自动化脚本时,pycharm专业版的使用期限只有30天, 找到了pycharm破解方法. 破解码:{"licenseId":"145446792566 ...