更好的方法来存储应用程序中许多地方所需的数据

时间:2015-04-13 07:16:46

标签: java android

之前已经多次询问过这个问题,但是在研究了几天之后我还没有找到合适的解决方案。

我在启动活动中从服务器获取数据(大约1 Mb的大数据),这将在应用程序的许多地方使用,所以我需要将这些数据存储在某些地方放置,以便从其他活动轻松访问。我可以想到很多方法来实现这个目标

1)在应用程序类中存储数据

似乎是简单直接的方法。但是由于NullPointerException存在应用程序崩溃的风险,当应用程序转到后台时,android系统会杀死应用程序类并重新创建它。由于数据是在splash活动中加载到应用程序类的,因此应用程序类的重新创建会破坏数据。 this article详细解释了这个问题。

2)将数据存储在磁盘中,并在每个活动中从磁盘再次读取

尽管这种方法消除了NullPointerException的可能性,但由于我们需要在每个活动中从磁盘读取文件,因此效率似乎较低。

3)在偏好设置中存储数据

对于较少的数据(键值对),这可能是一种很好的方法,但由于我必须存储大量数据,这对我来说是不可行的。

4)将数据存储在数据库中

数据结构不完整,我不认为将其存储在数据库中是我的要求的解决方案。此外,数据仅在从应用程序启动到应用程序被终止的持续时间内需要,因为每次打开应用程序时都会在启动活动中加载新数据。我会选择磁盘缓存而不是数据库。

5)通过意图传递数据

Intent putExtras方法也有大小限制,因此我们无法传递大数据。

我想知道是否有人遇到过这个问题,并为此找到了有效的解决方案?我更喜欢使用第一种方法,因此如果您可以建议一种方法来重新创建应用程序类中的数据(如果它被销毁)将会有所帮助。

感谢。

2 个答案:

答案 0 :(得分:0)

这取决于数据的类型,但根据个人经验,我建议将数据存储在 SQLite数据库中。 SQLite既可以线程安全又可以快速访问,大多数数据都适合关系数据库结构。此外,它不需要您将数据保存在RAM中,这可能导致您的应用程序因较弱的手机上的内存而被终止。

答案 1 :(得分:0)

使用单身人士

public class Singleton {

    private static class SingletonHolder {
        private static Singleton mInstance = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.mInstance;
    }

    private Singleton() {

    }

}

以上是具有最小开销的线程安全单例模式的示例。在您的情况下,您将初始化构造函数中的数据并通过singleton对象访问它。这可以保证如果对象被垃圾收集(您的应用程序被Android操作系统杀死),您的数据将在重新启动应用程序后重新加载,因为构造函数将再次运行。

我建议您使用getInstance()onLoadData()之类的方法将参数作为参数添加到onDataLoaded(),以便在数据显示时在UI中显示加载指示符正在重新加载。为了不在每个Activity和/或Fragment中实现显示加载代码,您可以使用提供加载指示符显示的基类。

相关问题