我的应用程序在后台闲置很长时间后崩溃了。我调试并发现它崩溃的原因是NullPointerException
。异常是由于当应用程序在后台时,应用程序单例类中的数据被垃圾收集器破坏。我在整个应用程序中使用静态数据。
我的问题是:有没有办法让应用程序类的数据在后台持久化?或者还有其他解决方案吗?
答案 0 :(得分:14)
要获得更准确的答案,请将代码放在此处。在,Android内存有限,因此VM可以删除它认为不必要的任何代码。
查看活动生命周期方法,特别是onResume
,并确保您完全理解。很多时候应用程序崩溃只是因为没有正确使用Activity生命周期方法。
Activity的另一个重要设计考虑因素是,无论持久性数据发生什么,您都应该使用某些默认值显示其UI。所以假设是这样的,如果我有数据我会显示,如果我没有,我真的不在乎。 您的用户界面永远不会在有或没有数据的情况下崩溃。您可以使用String.xml
存储某些默认值,甚至可以使用布局。
如果您仍然想要使用单件类,这非常好,但请确保每次尝试访问单件时都进行以下检查。
if (instance==null)
instance=Singleton.getInstance()
您的getInstance()
方法不仅会返回当前实例,还会确保
不要将数据从一个Activity静态访问到另一个Activity。对于你现在面临的类型问题而言,这对于android来说并不好,而且它也不是很好的OOP编程实践。
SharedPreference是保存数据的好方法,如果满足您的要求就可以了。
如果您想从不同的Android组件(如Activity,Service或BroadcastReciever)传递数据,您可以将其放在一个包中并按意图发送。而且,它们一直是SQLLite数据存储,文件IO等等。
答案 1 :(得分:2)
有几种不同的方法可以保存数据。如果它很小,你可以使用SharedPreferences
。否则也许是一个SQL数据库?
查看http://developer.android.com/guide/topics/data/data-storage.html
答案 2 :(得分:1)
如果可以,请将其存储在其他方法中。如果其复杂的数据结构,您可能必须重新启动应用程序。例如,我的应用程序中有一个用户单例,其中包含我的服务器的登录信息。如果我尝试的话,我无法保存它们 - 很多数据都隐藏在AWS变量中。我必须做的是检测我们在被清理后从主页重新启动时(而不是刚刚重新启动)并启动我的启动活动,然后完成当前活动。我不得不将其添加到我的应用中的每个活动。
答案 3 :(得分:0)
尽量避免在应用程序中使用导致这类问题的静态变量。尝试将您的数据保存在共享首选项中并使用它。
答案 4 :(得分:0)
活动不再可见,这就是为什么它转到onStop()而不是onResume()