SharedPreferences 使用

7人阅读 评论(0) 收藏 举报
分类:

1.context.getPreferences (int mode)

获取的是此Activity私有的Preference,以此Activity的名字命名,因此一个Activity只有一个,属于这个Activity。

保存在data/data/包名/shared_prefs位置下

public SharedPreferences getPreferences(int mode) {
    return getSharedPreferences(getLocalClassName(), mode);
}

2.context.getSharedPreferences (String name, int mode)

属于整个应用,可以有多个,以给定的name为文件名保存在系统中。
保存在data/data/包名/shared_prefs位置下

3.PreferenceManager.getDefaultSharedPreferences(context);

属于整个应用,只有一个,根据包名命名("包名"+"_preferences.xml")
其实也是调用context.getSharedPreferences (String name, int mode)
保存在data/data/包名/shared_prefs位置下
public static SharedPreferences getDefaultSharedPreferences(Context context) {
    return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
            getDefaultSharedPreferencesMode());
}

4.谨慎使用

SharedPreference将常驻内存,避免加载使用不到的,消耗内存
细分,将不常用与频繁使用的分开

ContextImpl中

private static ArrayMap<String, ArrayMap<String, SharedPreferencesImpl>> sSharedPrefs;

public SharedPreferences getSharedPreferences(String name, int mode) {
    SharedPreferencesImpl sp;
    synchronized (ContextImpl.class) {
        if (sSharedPrefs == null) {
            sSharedPrefs = new ArrayMap<String, ArrayMap<String, SharedPreferencesImpl>>();
        }
        //根据包名进行一级分类
        final String packageName = getPackageName();
        ArrayMap<String, SharedPreferencesImpl> packagePrefs = sSharedPrefs.get(packageName);
        if (packagePrefs == null) {
            packagePrefs = new ArrayMap<String, SharedPreferencesImpl>();
            sSharedPrefs.put(packageName, packagePrefs);
        }

        ........
        //当前包名,二级分类(具体SharedPreferences)
        sp = packagePrefs.get(name);
        if (sp == null) {
            File prefsFile = getSharedPrefsFile(name);
            //我们获取的就是SharedPreferences的实现类SharedPreferencesImpl
            sp = new SharedPreferencesImpl(prefsFile, mode);
            packagePrefs.put(name, sp);
            return sp;
        }
    }
    ............
    return sp;
}

SharedPreferencesImpl中

private Map<String, Object> mMap;
SharedPreferencesImpl(File file, int mode) {
    ..........
    mLoaded = false; //是否加载解析过
    mMap = null;    //键值对就是放这里
    startLoadFromDisk();
}


private void startLoadFromDisk() {
    synchronized (this) {
        mLoaded = false;
    }
    new Thread("SharedPreferencesImpl-load") {
        public void run() {
            synchronized (SharedPreferencesImpl.this) {
                loadFromDiskLocked();
            }
        }
    }.start();
}


private void loadFromDiskLocked() {
    if (mLoaded) {
        return;
    }
    ..........
    Map map = null;
    StructStat stat = null;
    try {
        stat = Libcore.os.stat(mFile.getPath());
        if (mFile.canRead()) {
            BufferedInputStream str = null;
            try {
                str = new BufferedInputStream(
                        new FileInputStream(mFile), 16*1024);
                map = XmlUtils.readMapXml(str); //读取到的数据放内存中(以键值对形式)
            } catch (XmlPullParserException e) {
                Log.w(TAG, "getSharedPreferences", e);
            } catch (FileNotFoundException e) {
                Log.w(TAG, "getSharedPreferences", e);
            } catch (IOException e) {
                Log.w(TAG, "getSharedPreferences", e);
            } finally {
                IoUtils.closeQuietly(str);
            }
        }
    } catch (ErrnoException e) {
    }
    mLoaded = true;//执行完后更换状态,下次不再重复加载
    if (map != null) {
        mMap = map;
        ........
    } else {
        mMap = new HashMap<String, Object>();
    }
    notifyAll();
}

获取值时

public int getInt(String key, int defValue) {
    synchronized (this) {
        awaitLoadedLocked();
        Integer v = (Integer)mMap.get(key);
        return v != null ? v : defValue;
    }
}
/**
 *如果SharedPreferences数据很多,那么首次解析,并紧跟着存取值时,主线程阻塞比较严重
 */
private void awaitLoadedLocked() {
   .......
    //上面创建SharedPreferencesImpl创建时,等loadFromDisk解析SharedPreference线程执行完后,才能跳过
    while (!mLoaded) {
        try {
            wait();//这里是主线程,阻塞了
        } catch (InterruptedException unused) {
        }
    }
}

查看评论

微信公众号使用

微信公众号使用,是一套基础课程,为后面的《PHP微信公众号开发》做铺垫。微信几乎是智能手机上必装的软件,很多的商家在微信上开通公众号,想要把公众号的价值发挥最大,必须学会公众号的使用,开发和营销。这一套课程重点教你学会公众号的使用,为后面的做好基础。欢迎反馈,QQ/微信:68183131
  • 2016年06月24日 14:48

Android的SharedPreferences的使用介绍

Android的SharedPreferences的使用介绍 一、SharedPreferences的简介 SharedPreferences是一种轻型的数据存储方式,它的本质是基于XML文件存储ke...
  • stop_pig
  • stop_pig
  • 2014-09-09 16:09:35
  • 6448

SharedPreferences史上最完整的使用步骤 5步走

SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来...
  • u010194271
  • u010194271
  • 2016-08-22 14:22:55
  • 2037

SharedPreferences的用法以及详解

用了很多次的SharedPreferences,这次来好好总结一下SharePreferences的用法以及需要了解的知识。主要是写给我第一位粉丝看的。希望以后的粉丝越来越多,我也更加有动力写更多更好...
  • MR_Condingson
  • MR_Condingson
  • 2017-02-28 10:03:44
  • 6150

Android sharedpreferences使用详解

SharedPreferences类提供了一个通用的框架,该框架允许您保存和检索持久的原始数据类型的键-值对。您可以使用SharedPreferences保存任何原始数据:布尔值、浮点型、int、lo...
  • wangkeke1860
  • wangkeke1860
  • 2015-02-27 21:36:24
  • 1030

使用SharedPreferences存储数据

SharedPreferences 可以替代读写文件的方法,保存一些外部数据。这些数据被保存为键值对的类型,所以对于像账号密码这种类型的数据,保存在SharedPreferences 中将会很方便。如...
  • jyDave
  • jyDave
  • 2015-12-17 12:46:15
  • 508

Android SharedPreferences用法及注意点详解

Android中的SharedPreferences1.简介SharedPreferences,Android中一种应用程序内部轻量级的存储方式,存取快且简单,数据以键值对的形式存储,键为String...
  • shuqiaoniu
  • shuqiaoniu
  • 2015-05-25 17:45:12
  • 596

SharedPreferences的简单用法

使用步骤:1、得到SharedPreferences对象2、调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。3、向Share...
  • baidu_31093133
  • baidu_31093133
  • 2016-05-22 20:24:03
  • 36797

在fragment中调用SharedPreferences

做一个分页效果,遵循android4.x SDK的建议不用tabhost 而是改用fragment 在fragment内的代码像在activity的写法几乎没有差别,一直很顺利,直到—— ...
  • u010932039
  • u010932039
  • 2014-07-25 15:27:49
  • 1143

fragment中使用sharedPreferences保存数据。

sp = this.getActivity().getSharedPreferences("config",    Context.MODE_PRIVATE); username = th...
  • qq_23017485
  • qq_23017485
  • 2015-06-02 15:32:38
  • 1616
    个人资料
    等级:
    访问量: 459
    积分: 111
    排名: 122万+