Android之SharedPreferences内部原理浅析
来源:互联网 发布:qq游戏网页版 mac 编辑:程序博客网 时间:2024/06/05 03:40
SharedPreferences内部工作原理:
1、调用getSharedPreferences();创建一个SharedPreferences对象,其中会先判断是否存在对应xml文件,如果发现存在则会有一个预加载操作,这个操作是把xml文件的内容通过I/O操作和XmlUitl解析后存入一个map对象中,所以我们调用SharedPreferences::getString();等get操作实际上是不会对文件做I/O操作,而是直接访问刚刚的map集合的内容,这提高了效率,如果对应的xml不存在则重新创建一个对应的xml文件。
部分实现如下:
@Override public SharedPreferences getSharedPreferences(String name, int mode) { SharedPreferencesImpl sp;//... sp = packagePrefs.get(name); if (sp == null) { File prefsFile = getSharedPrefsFile(name); //该构造方法会调用startLoadFromDisk();把数据从硬盘加载到内存 sp = new SharedPreferencesImpl(prefsFile, mode); packagePrefs.put(name, sp); return sp; }//... return sp; }
2、put写操作:写操作也有两步,一是把数据先写入内存中,即map集合,二是把数据写入硬盘文件中。这样才能保证数据的完整性,写操作有两个提交的方式:
commit():线程安全,性能慢,一般来说在当前线程完成写文件操作
apply():线程不安全,性能高,异步处理IO操作,一定会把这个写文件操作放入一个SingleThreadExecutor线程池中处理
3、SharedPreferences在第一次创建后会一直维持一个Singleton,每次调用getSharedPreferences()都返回唯一的一个实例
SharedPreferences a = getSharedPreferences("test",0); SharedPreferences b = getSharedPreferences("test",0); SharedPreferences c = getSharedPreferences("test",0); Log.i(TAG, "result: "+(a==b)+","+(b==c)); //12-04 13:38:17.811 2287-2287/com.sunzxy.myapplication I/MainActivity: result: true,true
SharedPreferences使用封装:
由于SharedPreferences的key与value其实最终都是以String类型存在,所以可以这样写一个SharedPreferences工具类:
/** * Created by Sunzxyong on 15/12/4. */public class PerferenceManager { private static final String PERF_NAME = "com.suznxyong.util.my_perf"; private static final int CURRENT_VERSION_CODE = 1; private volatile static PerferenceManager instance; private final SharedPreferences preferences; private PerferenceManager(Context context) { preferences = context.getSharedPreferences(PERF_NAME, Context.MODE_PRIVATE); checkPrefVersion(); } public static PerferenceManager getInstance(Context context) { if (instance == null) { synchronized (PerferenceManager.class) { if (instance == null) instance = new PerferenceManager(context); } } return instance; } public final void putValue(String key, String value) { preferences.edit().putString(key, value).apply(); } public final String getValue(String key) { checkIsLegal(key); return preferences.getString(key, ""); } public final void deleteValue(String key) { checkIsLegal(key); preferences.edit().remove(key).apply(); } public final void clear() { preferences.edit().clear().apply(); } private void checkIsLegal(String key) { if (TextUtils.isEmpty(key)) throw new IllegalArgumentException("This parameter is illegal,key : " + key); } private void checkPrefVersion() { final int oldVersion = preferences.getInt(PERF_NAME, 0); if (oldVersion < CURRENT_VERSION_CODE) { preferences.edit() .clear() .putInt(PERF_NAME, CURRENT_VERSION_CODE).apply(); } }}
由于应用版本升级时并不会删除SharedPreferences文件,所以可以加个版本判断,来进行一些数据更新,从上面看来,由于每一次调用getSharedPreferences()都会有IO操作,当内容比较多时,那么就不适宜在Application的onCreate中进行SharedPreferences文件初始化了,最好的办法是开个子线程去完成它的创建和数据的预加载!!!
- Android之SharedPreferences内部原理浅析
- 关于SharedPreferences的原理浅析
- Android之SharedPreferences详解与原理分析
- Android之SharedPreferences详解与原理分析
- Android之SharedPreferences详解与原理分析
- tomcat内部运行原理浅析
- Android程序编译原理之浅析
- Android程序编译原理之浅析
- Android程序编译原理之浅析
- Android刷机原理之recovery内部工作原理
- Android 之 SharedPreferences
- Android 之 SharedPreferences
- Android 存储之SharedPreferences
- Android之路-SharedPreferences
- Android之SharedPreferences
- Android 之 SharedPreferences示例
- Android之SharedPreferences权限
- Android基础之SharedPreferences
- 关于uitableview上面的一块空白的问题
- 如何使用xcode生成.ipa文件
- Hibernate学习笔记一
- android典型代码系列(十)------获取一个应用程序的权限信息(反射)
- Java 大作业回忆--day02-- PC端的初次尝试
- Android之SharedPreferences内部原理浅析
- 一个很有用的blog
- 史上最详细最容易理解的HMM文章 .
- Java中OutOfMemoryError(内存溢出)的三种情况及解决办法
- 016Handler的使用
- Linux解析DNS
- Android 用Intent调用系统中经常被用到的组件
- android典型代码系列(十一)------判断某个应用程序是 不是三方的应用程序
- connect timeout