2013-03-10 166 views
0

我的應用程序有調用MainActivity和它的一個成員的活動類使用Activity類的靜態成員是在後臺服務

public static SharedPreferences prefsdefault; 

我的應用還運行在背景上的服務(在另一個處理)。在我寫的服務裏面

MainActivity.prefsdefault.getString(Key,"Hello"); 

該應用程序有時會在此行拋出空指針異常。爲什麼?這意味着當我關閉該活動並且無法在任何時候訪問它(當我的服務運行時)時,垃圾收集器清理此成員?那麼對此的完美解決方案是什麼?

我應該將MainActiviy.class傳遞給服務嗎?當我實現一個需要上下文的線程時也會發生這種情況。

回答

1

這是因爲,即使您的prefsdefault可能已經初始化一次,您的整個應用程序也可以被垃圾收集並重新啓動。

在這種情況下,您的服務將找到該字段爲空。在活動中使用靜態字段出於一系列原因是錯誤的,最重要的是您的應用程序可能會被操作系統終止並重新啓動,並且之後所有靜態字段都會被再次清除。

使用共享首選項的正確方法是在需要訪問/寫入時使用getSharedPreferences訪問它們。

另一個奇怪的是你說服務在另一個進程中運行。在這種情況下,它不應該能夠從另一個進程訪問數據。

+0

我不明白「消滅」這個詞,如果我在我的活動中有static boolean x = true,並且它在應用程序中設置爲false。現在,如果操作系統重新啓動我的應用程序,x會是True還是False? – yasserbn 2013-03-10 18:42:32

+0

這是真的。出於同樣的原因,如果你有一個對象初始化的地方,如果os需要你的應用程序的資源,指向該對象的指針變爲null。 – fedepaol 2013-03-10 18:44:15

+0

這是我應該避免在Activity中使用靜態字段的原因嗎?現在,如果我想調用(從我的活動)一個線程,需要在活動中聲明的對象的信息?那麼解決方案是什麼?將MainActivity.class傳遞給Thread構造函數?也許? – yasserbn 2013-03-10 18:50:54

0

因爲prefsdefaultNULL。我沒有看到它被初始化。 你可以做到這一點的

prefsdefault = getSharedPreferences("my_preferences", Activity.MODE_PRIVATE); 

熱點提示:不要讓你的SharedPreference實例靜態

+0

線程需要的上下文等其他對象如何播放聲音?將MainActivity傳遞給構造函數?這是完美的想法嗎? – yasserbn 2013-03-10 18:34:25

+0

@yasserbn很難說沒有看到更多的代碼,這真的取決於;但不要使SharedPreference靜態。 – poitroae 2013-03-10 18:40:45

0

這樣做的原因是SharedPreferences將不會被初始化ü不需要做這樣的SharedPreferences是全球可用的應用程序,如果模式爲專用剛剛創造服務新的實例,以及它的工作