android - 我应该在 Activity 中缓存来自 SharedPreferences 的数据吗?

标签 android google-cloud-messaging

我正在开发一个基于 GCM 的应用程序,用户可以在其中订阅多个主题。

我需要知道用户在两个地方订阅了哪些主题:

  • 主要 Activity - 展示 SubscribeUnsubscribe用户界面中的按钮
  • GCM 监听器服务 - 通过 GcmPubSub 过滤消息和处理“过时”订阅.基本上,如果监听器收到的主题消息不在应用程序的主题列表中,那么我们可能在 GCM 服务器上有一个“过时的”订阅并且必须取消订阅。

所以基本上我有一个 Activity 和一个服务,它们都可以访问一些公共(public)数据并且都可以修改这些数据。

我读到在 Activity 和服务之间共享数据的选项之一是使用共享首选项:

这适合我的情况,因为我很乐意分享 Set<String>哪个SharedPreferences支持。用户可能只会对几个主题感兴趣(例如,最多 10 个)。

这是我检查用户是否订阅主题的代码:

SharedPreferences preferences = getPreferences(Context.MODE_PRIVATE);
Set<String> subscribedTopics = preferences.getStringSet(AufzugswaechterPreferences.SUBSCRIBED_TOPICS, Collections.<String>emptySet());
boolean subscribedForTopic = subscribedTopics.contains(topic);

这是修改订阅的代码(例如取消订阅):

SharedPreferences preferences =
        PreferenceManager.getDefaultSharedPreferences(getContext());
Set<String> topics = new TreeSet<String>(preferences.getStringSet(AufzugswaechterPreferences.SUBSCRIBED_TOPICS, Collections.<String>emptySet()));
topics.remove(topic);
preferences.edit().putStringSet(AufzugswaechterPreferences.SUBSCRIBED_TOPICS, topics).apply();

但现在我怀疑这是不是一种合适的方式。我基本上会为每次检查(在 UI 中或收到的消息中)以及修改访问共享首选项。

这是正确的方法吗?我应该直接通过首选项在 Activity 和服务之间共享数据,还是应该以某种方式缓存值?

最佳答案

您无需缓存 SharedPreferences 数据,如 SharedPreferencesImpl已经缓存了共享数据。

关于android - 我应该在 Activity 中缓存来自 SharedPreferences 的数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34684000/

相关文章:

android - Bluemix 示例应用程序失败并返回 "Failed to authenticate against MCA"

java - 如何在 Android 应用程序中存储和检索上次使用的 Activity session

android - Xamarin Android GCM 客户端不起作用

android - Android ICS 上的 GCM 通知不起作用

firebase - 在哪里可以找到 Firebase 云消息传递的 API key ?

java - 在 GCMIntentService 中实例化 TextToSpeech

android - 如何注册我的 Android 应用程序以解析网站

android - 获取 3D Android 设备方向

android - 如果父 Activity 包始终具有传递给 Fragment 的对象,那么 Fragment 包的用途是什么?

android SQLiteOpenHelper 和泄漏