从SharedPreferences读取与保留对象的实例

时间:2015-05-24 02:27:43

标签: android performance sharedpreferences

情景

我有一个使用用户设置的请求列表的类。请求列表存储在SharedPreferences中。我面临的困境是每次需要请求列表时是保留请求列表的实例还是从SharedPreferences中读取(这是非常频繁的)。

也不是说Gson用于反序列化对象。

代码如下:

public List<PrayerTimesCalculator.Time> getDefaultRequestList() {
    if (mRequestList != null) return mRequestList;
    // Try getting request list from preferences;
    Gson gson = new Gson();
    String json = mSharedPref.getString(KEY_PREF_REQUEST_LIST, null);
    Type listType = new TypeToken<List<Time>>() {
    }.getType();
    mRequestList = gson.fromJson(json, listType);
    if (mRequestList != null) return mRequestList;
    // Create default list;
    mRequestList = Arrays.asList(
           Time.DAWN,
           Time.MORNING,
           Time.AFTERNOON,
           Time.EVENING,
           Time.MID_NIGHT);
    return mRequestList;
}

目标

我担心的是,如果我保留请求列表的实例,并且该类有多个实例,则在该类的一个实例中对请求列表的更新将不会反映在其余实例中,直到它们被重新创造。

因此,我倾向于从SharedPreferences中读取,除非在所有情况下都有更好的方法来保持请求列表被反对更新。

问题

(1)那么,对象的多个实例经常从SharedPreferences读取相同的密钥效率如何? (2)是否有更好的方法可以在所有情况下保持对象请求列表的更新?

1 个答案:

答案 0 :(得分:3)

因此,您可以采取几种方法。

首先,你的对象很小 - 重读SharedPreferences成千上万次几乎不会引人注意。它不像SharedPreferences在远程驱动器上或“连接不良”。

其次,如果你不喜欢这个答案,那么你需要一个DAO(数据访问对象)。 SharedPreferences已经是这种形式。它提供了一种存储和检索数据的方法,您可以放心地获得最新的数据。但是,如果您觉得可以改进它的优化(因为它是通用的,这是您的应用程序),那么您可以通过执行“读取”和“写入”操作的静态对象提供对数据的访问。这将保证使用最新数据完成对对象的访问。当然,您需要具有线程感知等(SharedPreferences并不总能保证这一点。)

接下来,您可以将数据保存在数据库中并使用Cursor或其他内置或自定义DAO。这需要另一层次的复杂性和大量开销,但是当应用程序的多个组件可能需要访问数据,提供更新或需要实时监视更改时非常有用,因为后台线程或其他对象可能会进行修改您的应用行为或导致UI更新。

最后,您可以使用更复杂的数据存储,例如Content Provider。如果您希望/需要其他应用访问您的应用提供的数据(并且您的应用也可能使用该数据),则确实需要这样做。这是一个复杂的解决方案,实现完全超出了这个问题的范围。

但我提到它是因为您似乎有兴趣确保经常阅读SharedPreferences是可以接受的。这绝对是可以接受的 - 除此之外还有其他东西,数据库和内容提供商。