-2

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

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

这些在onCreate第一个活动的方法中初始化。这个活动除了根据状态(应用程序连接到服务器)启动其他活动之外什么都不做。

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

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

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

4

3 回答 3

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>

查看有关该主题的答案:

于 2013-02-07T11:30:28.743 回答
0

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

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

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

于 2013-02-07T12:21:34.323 回答
-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

谢谢,喜欢我的朋友。

于 2013-02-07T12:18:34.677 回答