为了在我的应用程序中存储运行时数据,我有一个包含两个静态变量的类:
public class App {
public static ClementineConnection mClementineConnection = null;
public static Clementine mClementine = null;
}
这些是在第一个Activity的onCreate
方法中初始化的。此活动除了根据状态(是连接到服务器的应用程序)启动其他活动外什么都不做。
如果应用程序空闲或在后台运行通知,则在访问其中一个静态变量时,有时会在其他onCreate方法中发生NullPointerException。不知怎的,他们收集了垃圾。 该应用程序有一个服务与一个在后台运行的线程,所以我认为必须始终有一个参考。
你知道如何防止这些静态变量被垃圾收集吗?当应用程序连接到服务器时,信息必须可用。创建新实例(例如Clementine.getInstance()
)不是一种选择。
如果您想查看代码:https://code.google.com/p/clementine-remote-android/source/browse/
答案 0 :(得分:0)
我认为您需要做的是使用Android Application Class。
在那里,您可以共享和保存数据到您的所有活动,并在那里初始化变量。您可以让App Class扩展它。
public class App extends Application {
public static ClementineConnection mClementineConnection = null;
public static Clementine mClementine = null;
在每项活动中:
App app = ((App)this.getApplication());
此外,您必须在清单中声明它;
<application android:name="de.qspool.clementineremote.App" ...></application>
看看有关这个问题的答案:
答案 1 :(得分:0)
使用静态变量存储应用的某些生命周期状态不可靠。 即使您使用某项服务,也可以在内存压力的情况下随时杀死该应用。 在最新的Android版本中,当用户在打开的应用列表中滑动应用时,它甚至会被杀死。
当应用程序被杀死时,Linux进程被终止,这意味着所有活动,服务都被杀死。当然这意味着静态变量会丢失。
我对这类事情进行了很多努力,并发现保持app状态始终存在的一种可靠的方法是使用SharedPreferences代替静态变量来存储应用程序的状态变量。
答案 2 :(得分:-2)
您应该通过始终扩展应用程序类来保存应用程序中的静态数据:
public class App extends Application {
public static ClementineConnection mClementineConnection;
public static Clementine mClementine;
}
当你的应用程序启动时它会自动实例化,所以只需将它的变量保存在你的第一个活动的oncreate中,如下所示 -
App.mClementineConnection = data;
It wont make any null pointer exception till your application is closed
。
谢谢,享受我的朋友。