带有静态对象的Android NullPointerException

时间:2013-02-07 11:23:11

标签: java android static nullpointerexception

为了在我的应用程序中存储运行时数据,我有一个包含两个静态变量的类:

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/

3 个答案:

答案 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

谢谢,享受我的朋友。