【问题标题】:What is more efficient? Static, data Passing, shared preferences, Database...?什么更有效率?静态、数据传递、共享首选项、数据库……?
【发布时间】:2012-03-02 07:00:02
【问题描述】:

我最近在 android 中做一个应用程序,在某些情况下我怀疑这是共享数据的有效方式。就像我可以在一个类中声明一个静态变量并使用 Classname.Variablename 从另一个类调用该变量,或者我可以按照我的意图传递该数据并从另一个类的意图中获取数据,或者我可以使用共享首选项并从中获取数据它或者我什至可以将该数据存储在数据库中并从数据库的其他类中检索它。我的疑问是哪种方法最有效(获取数据)?由于android应用程序最终是为手机设计的,内存使用和效率应该是限制条件。谁能指导我正确的道路,这将非常有帮助。

【问题讨论】:

    标签: android


    【解决方案1】:

    我的意见:

    每一个都是最好的取决于场景。让我解释一下。

    静态变量:

    静态变量是访问整个应用程序上下文的常用方法。如果你想维护少量数据在应用程序退出后不需要维护,这是最好的。

    通过 Intent 传递数据:

    这不是一种数据存储。这是一种数据共享。我认为这是将数据从活动传递到活动的最佳方式。但是在常量中维护值的键是一件很好的编程事情。

    共享偏好:

    Shared Preferences 只不过是一个包含两列的简单表格。 (核心价值)。

    优点:

    1. 快速检索
    2. 易于理解和编程

    缺点:

    1. 如果我们存储大量值,则很难维护密钥。
    2. 用户可以随时清除。

    数据库:

    当我们要存储大量具有复杂结构的值时,我们只剩下一个很好的解决方案,即。 D B。

    优势

    1. 我们可以维护数据结构。
    2. Android 有漂亮而简单的 API 来处理 sqlite 操作。

    缺点

    1. 与共享首选项相比,操作有点慢。
    2. 用户可以随时清除。

    所以我们发现主要问题是我们无法保持我们使用的任何存储的持久性。一个简单有效的解决方案是在每次应用启动时在线维护数据并与移动数据库同步。

    【讨论】:

    • 与共享首选项相比,您确认 sqlite 操作速度慢的来源是什么?
    【解决方案2】:

    我可能是错的,但我觉得我必须分享我的知识/经验......嗯,最快和最简单的方法是使用静态......但我不会推荐这个。

    我的选择是: 数据库

    原因:

    1- 通过声明静态变量,它是not reliable,因为在某些阶段,当您的应用程序或其他应用程序占用过多内存时,GC会尝试收集所有未引用对象, static 在这里是一个很好的候选者......就像 Activity A 有静态变量,而你目前在 Activity B 中,现在 gc 将删除 A 及其对象,它也有可能收集静态变量。现在选择数据库在这里很明显,我不需要告诉你,因为在你当前的活动中,你总是可以从数据库中检索数据。

    2- 通过声明静态变量,如果它只是一个 int 或小数据类型,那没什么大不了的,但是如果你要保存一大堆复杂结构,那么有您的活动很有可能会leak memory,这也会给您带来麻烦。正确使用数据库不会泄漏。

    SharedPreference/intent 也很好/快速/内存效率高(我猜),但在传递大型复杂结构时会有点混乱。

    总而言之,如果您只想传递一个小结构(字符串 + int)并且您的应用程序没有触及堆的限制,那么您可以使用 static 但如果您正在进行一些内存密集型调用和传递一些大数据然后database 是可靠的,可能比静态慢一点,但足够快以至于我们不会注意到。

    希望对你有帮助。

    【讨论】:

    • 关于你的第一点,我不相信静态是垃圾收集的。见stackoverflow.com/questions/453023/…。使用静态仍然是个坏主意,因为当进程被杀死时它们就会消失。
    • 好吧,我一开始就说过,我可能是错的......并且对 cme​​ts 非常开放......这是基于我的经验,如果你的堆使用率太高怎么办? gc 将收集所有活动和所有数据,除了你当前存在的那个......这就是我想说的。
    • @Farhan 感谢您让我知道如果堆栈中的活动过多,可能会丢失静态变量值。为它+1。但我接受了 SadeshKumar 的回答,因为它提供了更多信息。
    • 是的,没有问题的朋友,投票对我来说就足够了,因为它告诉我非常正确...... :)
    【解决方案3】:

    在我看来,

    这取决于数据的类型及其重要性。您可以通过以下方式使用它们,

    • Static :在应用程序运行之前您的使用受限。
    • SharedPreferenced :当数据量非常小但对未来使用很重要时。
    • Database : 当你有大量数据时。

    【讨论】:

      【解决方案4】:

      不要使用静态变量。当您返回活动时,它将为 null 。

      详情请见this answer

      【讨论】:

      • 老兄。你完全没有回答我的问题。
      猜你喜欢
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 2020-10-04
      • 2020-08-18
      相关资源
      最近更新 更多