2013-02-25 80 views
1

所以我一直在處理從服務器接收數據的項目,例如sessionKey。我創建getter和setter方法是這樣的:Getter和Setter在Android中返回null

public class sEngine 
{ 
private static String sessionKey; 

public static String getSessionKey() { 
     return sessionKey; 
    } 

    public static void setSessionKey(
      String sessionKey) { 
     sEngine.sessionKey = sessionKey; 
    } 
} 

然後,我有活性A.在此活動A,I值插入setter方法。

public class A extends Activity 
{ 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 

sEngine.setSessionKey("Hello world") 
} 
} 

我也有活動B.在該活動中B,我叫

public class B extends Activity 
{ 
    @Override 
     protected void onCreate(Bundle savedInstanceState) { 

      String sessionKey = sEngine.getSessionKey(); 
    } 
} 

它發生對我來說,Android的抹布有時候所有的數據,以便釋放一些內存,對於getter方法例如,當我讓程序閒置太久時,或者我使用了Advanced Task Killer。問題是如果發生這種情況,當我調用getter方法時,我將在活動B中得到null,儘管我已經在活動A中設置了值。有什麼方法可以讓我保持通過setter方法存儲的值(除了使用SharedPreference),所以雖然Android會擦除存儲器/數據,但值仍然存在?

+1

爲什麼不會告發」你想使用SharedPreferences嗎?它很容易使用,從這個問題*是安全的,這是一個普遍接受的方法。 – 2013-02-25 04:29:04

+0

讓你的'sEngine'成爲單身。希望它可以幫助你。 – 2013-02-25 04:33:35

+0

您也可以將數據保存在軟件包中 – Pragnani 2013-02-25 04:35:44

回答

5

有沒有辦法對我來說,保持通過的setter方法 (不是使用SharedPreference等)存儲的值,因此該值仍然會 雖然有Android的一抹記憶/數據?

不知道爲什麼你不想使用SharedPreferences,儘管它是你的需求的完美候選人。當有些事情如此簡單可存儲它:

SharedPreferences sharedPrefs = getApplicationContext().getSharedPreferences(SOME_KEY, Context.MODE_PRIVATE); 
Editor editor = sharedPrefs.edit(); 
editor.putString("session_key", sessionKey); 

這將確保您的sessionkey始終保持存儲,便於檢索。除非用戶清除您的應用程序數據。

你唯一的,而不是SharedPreferencessessionkey被保存到Database這在我看來,考慮到今後執行任務的替代品,是絕對必要的。

你也可以考慮寫作sessionkey文本文件然後它以檢索數據。

SharedPreferences的兩種替代方案都不適合您的需要。我真的會敦促你重新考慮使用SharedPreferences

+2

+1。如果要儘可能防止數據丟失,持久存儲是最安全的方式。是的,用戶可以清除您的應用程序數據,但他們可以輕鬆地在應用程序中擦除靜態字符串。你也可以做雲存儲;) – 2013-02-25 04:45:55

+0

@ A - C:這是我覺得OP不想使用這樣一個有用的功能有趣的。 – 2013-02-25 04:47:34

+0

@SiddhartLele是的,我的壞。實際上,SharedPreferences想起來了,但我認爲使用SharedPreferences保存每個變量是一種糟糕的方法,因爲我仍然有大約12個變量與getter setter方法一樣存儲。所以我正在尋找更簡單更好的方法。感謝你的回答! – 2013-02-25 05:55:04

0

試試這個,在A Activity中聲明你的非活動類。然後設置您的會話值。

sEngine mengine = new sEngine(); 
mengine.setSessionKey("Hello world"); 

並且還獲得B活動中的會話值。

sEngine mengine = new sEngine(); 
String str = mengine.getSessionKey(); 
+0

你正在創造新的實例。如果字符串仍然是「靜態」,這將有相同的問題。如果字符串不是靜態的,你會創建兩個單獨的對象,每個對象具有不同的'sessionKey'。單例方法可能有效,但在低內存情況下也很可能會被殺掉,並且在重新創建時,字符串將再次爲空。 – 2013-02-25 04:39:48

+0

不使用靜態值。 public String sessionKey已經足夠 – MuraliGanesan 2013-02-25 04:41:26

+3

你如何期待兩個單獨的實例具有相同的'sessionKey'?從我的評論:*如果字符串不是靜態的,你會做兩個單獨的對象,每個對象具有不同的'sessionKey'。* – 2013-02-25 04:42:23

0

變化

sEngine.sessionKey = sessionKey; 
在你的代碼

this.sessionKey = sessionKey; 

只是

sessionKey = sessionKey; 

使用sEngine.讓人相信你的類是static.Which它不是!

,如果你想在你的代碼的任何地方使用這個sEngine.需要聲明這個類作爲static。在你只需要進行類聲明爲靜態的話:

public static class sEngine { 
+0

*'公共靜態類sEngine' *請仔細閱讀靜態類實際是什麼。你不**必須聲明一個類爲靜態(並且實際上不能用於頂級類)以允許使用靜態成員。做'sEngine.sessionKey'是完全有效的,因爲類成員是靜態的,所以'ClassName.memberName'沒有問題,**不代表類是靜態的。 – 2013-02-25 04:57:10