2013-02-07 59 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

相關問題