【问题标题】:Read speed of SharedPreferencesSharedPreferences 的读取速度
【发布时间】:2013-10-09 12:10:46
【问题描述】:

SharedPreferences 有多快?有没有办法将它们放在内存中以供阅读?我有少量数据,ListView 必须查询以显示每个单元格,我担心调用闪存会太慢。我不担心写入速度,因为写入很少发生。我正在考虑只使用 JSON 对象而不是 SharedPreferences 来保存数据。有什么想法吗?

【问题讨论】:

  • SharedPreferences 本质上是驻留在应用程序“沙盒”存储中的 xml 文件。可以通过亚行访问和查看。

标签: android performance sharedpreferences


【解决方案1】:

有没有办法将它们放入内存中以供阅读?

它们在内存中,在第一次引用之后。第一次检索特定的SharedPreferences(例如PreferenceManager.getDefaultSharedPreferences())时,数据会从磁盘加载并保留。

【讨论】:

  • 你说,一旦你得到PreferenceManager.getDefaultSharedPreferences()的实例,SharedPreferences中保存的全部数据就会被加载???
  • @MoshErsan:是的。 SharedPreferences 保存在 SharedPreferences 的静态 HashMapContextImpl 中。它将一直保留在那里,直到进程终止。见sSharedPrefsgithub.com/android/platform_frameworks_base/blob/master/core/…
  • 这样做有什么好处?!!
  • @MoshErsan:除其他外,它确保您的应用程序的所有组件,请求相同的SharedPreferences,获得实际相同的SharedPreferences 实例,因此它们不会与彼此。
  • @MoshErsan:正确。 SharedPreferences 应该很小。
【解决方案2】:

我有少量数据需要 ListView 查询 显示每个单元格

你不能做一个单例,一个普通的类,然后从那里第二次读取它吗?我会这样做的。

【讨论】:

  • 没有必要通过单例增加共享全局状态。 Android 已经通过SharedPreferencesBundles 提供了全局状态管理解决方案。就够了。你应该尽可能地消除全局状态
【解决方案3】:

我的建议是先测试您的性能,然后再开始担心速度。一般来说,你会更喜欢一个优先考虑可维护性和速度的应用程序。如果工程师在让应用程序稳定之前就开始实现性能,结果是应用程序运行速度更快但有很多错误。

【讨论】:

    【解决方案4】:

    根据this 链接,getSharedPreferences 并没有那么重,因为它只有在您第一次调用getSharedPreferences 时才会打开文件:

    // There are 1000 String values in preferences
    
    SharedPreferences first = context.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);
    // call time = 4 milliseconds
    
    SharedPreferences second = context.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);
    // call time = 0 milliseconds
    
    SharedPreferences third = context.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);
    // call time = 0 milliseconds
    

    但是第一次调用get方法需要一些时间:

    first.getString("key", null)
    // call time = 147 milliseconds
    
    first.getString("key", null)
    // call time = 0 milliseconds
    
    second.getString("key", null)
    // call time = 0 milliseconds
    
    third.getString("key", null)
    // call time = 0 milliseconds 
    

    【讨论】:

    • 所以它看起来像一个“惰性”实现,加载发生在第一次获取。
    猜你喜欢
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 2012-09-19
    • 2019-02-09
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多