之前已经多次询问过这个问题,但是在研究了几天之后我还没有找到合适的解决方案。
我在启动活动中从服务器获取数据(大约1 Mb的大数据),这将在应用程序的许多地方使用,所以我需要将这些数据存储在某些地方放置,以便从其他活动轻松访问。我可以想到很多方法来实现这个目标
1)在应用程序类中存储数据
似乎是简单直接的方法。但是由于NullPointerException
存在应用程序崩溃的风险,当应用程序转到后台时,android系统会杀死应用程序类并重新创建它。由于数据是在splash活动中加载到应用程序类的,因此应用程序类的重新创建会破坏数据。
this article详细解释了这个问题。
2)将数据存储在磁盘中,并在每个活动中从磁盘再次读取
尽管这种方法消除了NullPointerException
的可能性,但由于我们需要在每个活动中从磁盘读取文件,因此效率似乎较低。
3)在偏好设置中存储数据
对于较少的数据(键值对),这可能是一种很好的方法,但由于我必须存储大量数据,这对我来说是不可行的。
4)将数据存储在数据库中
数据结构不完整,我不认为将其存储在数据库中是我的要求的解决方案。此外,数据仅在从应用程序启动到应用程序被终止的持续时间内需要,因为每次打开应用程序时都会在启动活动中加载新数据。我会选择磁盘缓存而不是数据库。
5)通过意图传递数据
Intent putExtras
方法也有大小限制,因此我们无法传递大数据。
我想知道是否有人遇到过这个问题,并为此找到了有效的解决方案?我更喜欢使用第一种方法,因此如果您可以建议一种方法来重新创建应用程序类中的数据(如果它被销毁)将会有所帮助。
感谢。
答案 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
中实现显示加载代码,您可以使用提供加载指示符显示的基类。