2013-04-28 52 views
0

我遇到了一個奇怪的問題,看起來像是一個簡單的應用程序來創建(一個總是要求麻煩的想法)。重新啓動後Android應用程序共享偏好設置爲空

基本上,應用程序以MainActivity開頭,用戶用它登錄到應用程序。如果成功MainActivity通過使用startActivity轉到下一個活動ItemzList。這一切都很好,一旦啓動ItemzList,它就會使用SharedPreferences中的字符串列表填充它的ListView

再次,這工作得很好。但是,如果您按下「主頁」按鈕並重新啓動應用程序,當ItemzListSharedPreferences加載列表時,列表突然變空(我已用調試器和我的設備確認)。

我知道它與被緩存的應用程序有關,因爲如果我在應用程序上「強制停止」,然後重新啓動該列表再次運行。

我是否錯誤地訪問了共享首選項?

SharedPreferences settings = getSharedPreferences("MAIN", MODE_PRIVATE); 
Set<String> tempSet = settings.getStringSet("LIST", new HashSet<String>()); 
+0

在哪裏你是否正在執行加載?如果它正在啓動創建它可能沒有第二次調用 – MrChaz 2013-04-28 17:27:10

+0

在OnCreate中,它第二次調用,但SharedPreferences返回一個空集合。我已經通過文件探索在Eclipse中,由sharedPreferences創建的MAIN.xml文件確實具有Set 的值。 – Copperfield81 2013-04-29 01:08:31

回答

0

發現錯誤。之後,我處理了Set tempSet,然後清除了tempSet(無法回想我背後的推理)。

SharedPreferences settings = getSharedPreferences("MAIN", MODE_PRIVATE); 
    Set<String> tempSet = settings.getStringSet("LIST", new HashSet<String>()); 
    ArrayList<String> stringsEnc = new ArrayList<String>(tempSet); 
    tempSet.clear(); //This is the erroneous line 

我想清除「TEMPSET」一些如何清除了sharedPreferences List對象(但不包括XML文件本身),所以如果應用程序被緩存,以「getSharedPreferences」下一個呼叫只會重複使用緩存版本(它有清單?)無論如何刪除線修復了問題。

0

終於讓我找到了解決辦法,只要把你的首選項的代碼異步任務裏,它會工作,我DON「T知道爲什麼,但它會奏效。


 prefss = getSharedPreferences(ACCOUNT_PREFS_NAME, MODE_MULTI_PROCESS); 

       new AsyncSave(favNamesList).execute(); 

private static class AsyncSave extends AsyncTask<Void, Void, Boolean> { 
     ArrayList<String> favNamesList; 

     AsyncSave(ArrayList<String> favNamesList) { 
     this.favNamesList = favNamesList; 

    } 

    @Override 
    protected Boolean doInBackground(Void... params) { 
     HashSet<String> strings = new HashSet<String>(); 
      strings.addAll(favNamesList); 
      prefss.edit().putStringSet("favNames", strings).apply(); 
      return null; 
    } 
} 
相關問題