2012-07-19 63 views
35

我正在使用多个SharedPreferences在我的应用程序中存储数据。 一些喜好被用于许多活动。SharedPreferences应用程序上下文vs活动上下文

我知道SharedPreferences在内部由映射支持,以便在设置更改时快速读取访问并写入SD卡。

我不知道哪种方式是更好,如果一个sharedpreference是由很多活动比较的访问:

  1. 使用活动上下文中实例化在每一个活动。
  2. 在每个活动中实例化它,但使用应用程序上下文。
  3. 把它放在例如应用程序类并仅在那里实例化它,类似于单例。

如果我使用1.解决方案是否有每个活动的共享首选对象?当活动被破坏时,sharedpreference的内部地图会被破坏吗?

如果我使用2.解决方案将只有一个实例,虽然我在每个活动中调用getSharedPreferences?只要应用程序还活着,内部映射会在内存中吗?

希望有人知道Android如何在内部处理它。

+0

我会建议选择三,你可以从你所有的活动中获得,你只需要做一次阅读。 – Joel 2012-07-19 18:38:11

回答

55

这是值得检讨的是sources表明,Context实例(无论是一个ActivityApplication实例)共享同一个静态地图HashMap<String, SharedPreferencesImpl>

所以每当你通过Context.getSharedPreferences(name, mode)同名要求的SharedPreferences一个实例你会得到相同的情况下,因为它首先检查是否在地图已包含一个密钥(这是通过名称)SharedPreferences实例。一旦加载了实例SharedPreferences,它将不会再次加载,而是从地图中取而代之。

所以实际上你走哪条路并不重要,重要的是使用相同的名字以便从应用程序的不同部分获得相同的前缀。然而,为首选项创建一个“访问点”可能是一个优点。所以它可能是在Application.onCreate()中实例化的prefs的单例包装器。

+0

+1即使我相信如此..感谢您的批准 – Rasmus 2012-07-19 20:54:30

7

我会更喜欢使用类的偏好,通过应用程序上下文初始化偏好一次。创建getter和setter(get/put)方法来添加,更新和删除数据。

这样它会创建实例一次,并且可以更具可读性,可重用。

+0

当应用程序从HTTP请求中返回时也很好。在这种情况下,上下文(活动)可能不存在,因此context.getSharedPreferences将导致NPE。当使用单身时,这不会发生。 – CoolMind 2017-01-25 16:33:12

11

SharedPreferences由Android作为单身内部管理。

context.getSharedPreferences(name, mode); 

只要您使用相同的名称,您总能获得相同的实例:只要你想使用你可以得到尽可能多的实例。因此没有并发问题。

相关问题