【问题标题】:Android NullPointerException with static Objects带有静态对象的 Android NullPointerException
【发布时间】:2013-02-07 11:23:10
【问题描述】:

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

public class App {
  public static ClementineConnection mClementineConnection = null;
  public static Clementine mClementine = null;
}

它们在第一个 Activity 的 onCreate 方法中初始化。此 Activity 仅根据状态(应用程序是否连接到服务器)启动其他 Activity。

如果应用程序处于空闲状态或在后台运行并发出通知,则有时在访问其中一个静态变量时,其他 onCreate 方法中会发生 NullPointerException。他们以某种方式收集垃圾。 该应用程序有一个在后台运行的带有线程的服务,所以我认为必须一直有一个引用。

您知道如何防止这些静态变量被垃圾收集吗?当应用程序连接到服务器时,信息必须可用。创建新实例(例如Clementine.getInstance())不是一种选择。

如果你想看代码:https://code.google.com/p/clementine-remote-android/source/browse/

【问题讨论】:

  • 尝试做静态最终
  • @chintankhetiya 他不能做到final,因为他正在分配其他活动

标签: java android static nullpointerexception


【解决方案1】:

我认为你需要做的是使用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>

查看有关该主题的答案:

【讨论】:

【解决方案2】:

使用静态变量来存储应用的某些生命周期状态是不可靠。 即使您使用服务,应用程序也可以在内存压力的情况下随时终止。 在最新的 Android 版本上,当用户在打开的应用列表中滑开应用时,它甚至会被杀死。

当一个应用被杀死时,Linux进程被杀死,这意味着所有的活动、服务都被杀死。当然这意味着静态变量会丢失。

我与这类事情进行了很多斗争,发现让应用程序状态始终保持活跃的一种可靠的好方法是使用SharedPreferences而不是静态变量来存储应用程序的状态变量。

【讨论】:

  • 对象存储信息,这些信息在应用关闭后不需要可用。它存储应用程序每次连接到服务器时从服务器下载的当前曲目、元数据等信息。所以它不需要存储在 SharedPreferences 中。 (我没有否决你的帖子)
【解决方案3】:

您应该始终通过扩展应用程序类将静态数据保存在应用程序中:

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

谢谢,喜欢我的朋友。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多