【问题标题】:getDefaultSharedPreferences(Context) - any context?getDefaultSharedPreferences(Context) - 任何上下文?
【发布时间】:2014-01-17 18:25:49
【问题描述】:

I have a helper class 用于处理默认的共享首选项。我检索了一次首选项,然后包装了我需要的所有 SP 方法,提供了相同的缓存实例。它是这样的:

public final class AccessPreferences {

    private static SharedPreferences prefs; // cache

    private static SharedPreferences getPrefs(Context ctx) {
        // synchronized is really needed or volatile is all I need (visibility)
        SharedPreferences result = prefs;
        if (result == null)
            synchronized (AccessPreferences.class) {
                result = prefs;
                if (result == null) {
                    result = prefs = PreferenceManager
                        .getDefaultSharedPreferences(ctx);
                }
            }
        return result;
    }

    public static boolean contains(Context ctx, String key) {
            if (key == null)
                throw new NullPointerException("Null keys are not permitted");
            return getPrefs(ctx).contains(key);
    }
    //etc
}

我有两个问题想绝对确定:

  • 我需要像我一样进行同步还是一个简单的 volatile 就足够了?当然,这个帮助类由不同的线程(UI、Intent 服务等)访问。
  • 检索共享首选项时是否需要致电ctx.getApplicationContext()

我对 Froyo 及以上感兴趣

【问题讨论】:

    标签: android multithreading sharedpreferences android-context


    【解决方案1】:

    使用同步,但我建议使用 ReentrantLock (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html) 之类的东西,而不是“同步”。它通常性能更高。

    任何上下文都可以工作,当然只要它不为空。我将在这里使用应用程序上下文,这将使您的调用者不必提供它。公开对其的静态引用,如下所示:Static way to get 'Context' on Android?

    【讨论】:

    • "使用同步" -> 为什么不只是 volatile ? “任何上下文都可以”->不会保留对它的引用吗?积极的 ?顺便说一句,扩展应用程序不受欢迎 - 这是在一个库中 - 我的调用者 必须为我提供一个上下文
    • 如果你打算对单例使用“双重检查锁定”方法,是的,使用 volatile 和同步。这里有一个很好的例子en.wikipedia.org/wiki/Double-checked_locking。更好的是,为什么不采用最新公认的方法,使用枚举?这也允许延迟加载类型访问并且是线程安全的:en.wikipedia.org/wiki/Singleton_pattern#The_Enum_way 我不认为扩展应用程序。不赞成(参考?)。您仍然可以获取应用上下文:developer.android.com/reference/android/content/….
    • 另外,如果您要保留任何上下文引用......它应该是应用程序上下文。任何其他上下文都可能导致内存泄漏(图像等),相信我,你不想处理。换句话说,我宁愿引用像应用程序上下文这样的非可视上下文,而不是知道有多少可能是 UI 元素的引用。
    • 另一个应用程序上下文优于活动的例子。由 Romain Guy 本人撰写:android-developers.blogspot.com/2009/01/…
    • 这里没有单例,也不可能,枚举模式(我广泛使用)没有位置。我确实使用了仔细检查,但我想知道它是否可以被 volatile替换,因为我认为这很清楚。正如你所看到的,我当然没有坚持任何背景——我不知道 SP 在做什么——这就是我要问的。供您参考搜索“Hackborn”和“扩展应用程序”。请尝试回答问题而不是我没有问的其他问题,并且知道答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 2012-06-02
    • 2011-07-20
    • 2020-11-23
    • 1970-01-01
    • 2021-03-01
    相关资源
    最近更新 更多