20

我的应用程序在后台闲置了很长时间后崩溃。我调试并发现它崩溃的原因是由于NullPointerException. 异常是由于应用程序单例类中的数据在应用程序处于后台时被垃圾收集器销毁。我在整个应用程序的每个活动中都使用静态数据。

我的问题是:有没有办法让应用程序类的数据在后台持久化?或者有没有其他解决方案?

4

5 回答 5

14

为了获得更准确的答案,您将代码放在这里。开启时,Android 内存是有限的,因此 VM 可以删除它认为不必要的任何代码。

查看 Activity 生命周期方法,特别onResume是确保您完全理解它。很多时候应用程序崩溃只是因为没有正确使用 Activity 生命周期方法。

Activity 的另一个重要设计考虑因素是,无论持久性数据发生什么情况,您的 Activity 都应该使用一些默认值显示其 UI。所以假设是这样的,如果我有数据我会显示,如果我没有,我真的不在乎无论有无数据,您的 UI 都不应崩溃。您可以String.xml用于存储一些默认值甚至在布局中。

如果您仍然想使用单例类,这非常好,但请确保每次尝试访问单例时都进行以下检查。

if (instance==null)
    instance=Singleton.getInstance()

您的getInstance()方法不仅返回您当前的实例,它还将确保

  • 它初始化所有对象和变量
  • 其他单例方法作为实例方法

不要静态地从一个活动访问数据到另一个活动。对于您现在面临的类型问题,这对 android 来说并不好,而且它也不是很好的 OOP 编程实践。

SharedPreference是保存数据的好方法,如果符合您的要求,那就去吧。

如果您想从不同的 Android 组件(如 Activity、Service 或 BroadcastReciever)传递数据,您可以将其放入包中并作为意图发送。而且,它们一如既往地是 SQLLite 数据存储、文件 IO 等。

于 2013-04-12T07:02:46.893 回答
2

有几种不同的方法来保存数据。如果它是小东西,你可以使用SharedPreferences. 否则也许是一个 SQL 数据库?

查看http://developer.android.com/guide/topics/data/data-storage.html

于 2013-04-12T06:22:03.327 回答
1

如果可以,请将其存储在其他方法中。如果其数据结构复杂,您可能必须重新启动应用程序。例如,我的应用程序中有一个用户单例,其中包含我的服务器的登录信息。如果我尝试过,我无法保存这些数据 - 很多数据都隐藏在 AWS 变量中。我必须做的是检测我们何时在清理后从主页重新启动(而不是仅仅重新启动)并启动我的起始活动,然后完成当前活动。我必须将它添加到我的应用程序中的每个活动中。

于 2013-04-12T06:25:54.020 回答
0

尽量避免在您的应用程序中使用导致此类问题的静态变量。尝试将您的数据保存在共享首选项中并使用它。

于 2013-04-12T06:22:11.683 回答
0

Activity 不再可见,这就是它使用 onStop() 而不是 onResume() 的原因

于 2016-08-28T15:42:46.513 回答