我有一個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" />
你能否確認dataJson返回的是corrent值,而不是null? – Marius 2014-09-22 07:17:44
是的,它是正確的。另外,在編寫SharedPreferences的編輯器之後,我立即得到它,並且它是正確的(請參閱Log.d代碼)。 – mrmoment 2014-09-22 07:19:51
SharedPreference名稱在哪裏? – Aniruddha 2014-09-22 07:22:46