2014-09-22 35 views
1

我有一個LoginActivity,它調用AsyncTask來向服務器發送用戶名和密碼,並在響應時將它寫入用戶名SharedPreferences(可以從此處檢索用戶名)並返回到可能的應用程序MainActivity。但是,我從MainActivity的SP中檢索用戶名,它是null。我在哪裏做錯了?SharedPreferences getString在AsyncTask中由編輯器設置返回null

的AsyncTask代碼:

//activity is the context passed from LoginActivity (using "this") 
protected void onPostExecute(String result) { 
    if(result!=null){ 
     try { 
      JSONTokener jsonParser = new JSONTokener(result); 
      JSONObject msg = (JSONObject) jsonParser.nextValue(); 
      String data=msg.getString("data"); 
      int code=Integer.parseInt(msg.getString("code")); 
      if(code==0){ 
       //Write to local storage 
       SharedPreferences settings = activity.getPreferences(Context.MODE_PRIVATE); 
       SharedPreferences.Editor editor = settings.edit(); 
       JSONTokener dataParser = new JSONTokener(data); 
       JSONObject dataJSON=(JSONObject) dataParser.nextValue(); 
       editor.putString("acc_username", dataJSON.getString("username")); 
       if(dataJSON.getString("token")!=null){ 
        editor.putString("acc_token", dataJSON.getString("token")); 
       } 
       editor.commit(); 
       //Log.d("TEST",activity.getPreferences(Context.MODE_PRIVATE).getString("acc_username", null));//I can get the username here -- means the post and login request and response are correct. 
       Intent intent=new Intent(activity, MainActivity.class); 
       intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
       activity.startActivity(intent);  
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

MainActivity代碼:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //read login info from device 
    SharedPreferences settings = getPreferences(MODE_PRIVATE); 
    String accUsername = settings.getString("acc_username", null); 
    Log.d("TEST","accUsername="+accUsername);//it is null! 
} 

清單權限:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
+0

你能否確認dataJson返回的是corrent值,而不是null? – Marius 2014-09-22 07:17:44

+0

是的,它是正確的。另外,在編寫SharedPreferences的編輯器之後,我立即得到它,並且它是正確的(請參閱Log.d代碼)。 – mrmoment 2014-09-22 07:19:51

+0

SharedPreference名稱在哪裏? – Aniruddha 2014-09-22 07:22:46

回答

4

的問題是,你使用了錯誤的方法:的getPreferences(INT模式)。請參閱文檔: http://developer.android.com/reference/android/app/Activity.html#getPreferences(int)

「通過傳入此活動的類名稱作爲首選項名稱,它只是調用基礎getSharedPreferences(String,int)方法。」

因此,在您的代碼中,用於保存數據的首選項文件名可能是「LoginActivity」,因爲您將它保存在LoginActivity類中。然後,當通過使用getPreferences(int mode)獲得MainActivity類中的數據時,意味着您想從名爲「MainAcitity」的首選項文件中獲取數據。所以,你必須得到一個空值。

如何解決您的問題: 使用getSharedPreferences(String,int)方法而不是getPreferences(int模式)並在兩個Activity類中提供保存首選項文件名。

2

使用getSharedPreference方法代替getPreference。