2013-02-07 61 views
-2

对于存储在我的应用程序运行时的数据我有两个静态变量的类:的Android NullPointerException异常与静态对象

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/

+0

尝试使静态最终 –

+0

@chintankhetiya他不能让它成为'最终',因为他在其他活动中分配 – TheWhiteRabbit

回答

0

我认为你需要做的,就是用Android Application Class

在那里,您可以共享数据并将其保存到所有活动中,并初始化那里的变量。你可以让你的App类扩展它。

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> 

看看关于这个问题的答案:

+0

可以使用App.mClementine访问成员吗?或者我必须使用getApplication()? – amuttsch

+0

不确定。我在我的代码中使用它,但现在没有。 – RMalke

+0

我认为你的解决方案有效。不过还得做更多的测试。谢谢。 – amuttsch

-2

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

public class App extends Application { 
    public static ClementineConnection mClementineConnection; 
    public static Clementine mClementine; 
} 

它会当你的应用程序启动,从而只需在您第一次activiy的OnCreate中保存它的变量如下 -

App.mClementineConnection = data; 

而且It wont make any null pointer exception till your application is closed自动实例化。

谢谢,喜欢我的朋友。

0

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

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

我与这类事情发生了很大的冲突,并发现一直保持应用程序状态的好方法是使用SharedPreferences而不是静态变量来存储应用程序的状态变量。

+0

为何投票?答案是我能看到的最好的... – muslidrikk

+0

对象存储信息,这些信息在应用程序关闭后不需要提供。它存储每当应用程序连接到服务器时从服务器下载的信息,例如当前曲目,元数据等。所以它不需要存储在SharedPreferences中。 (我没有投下你的帖子) – amuttsch

相关问题