2014-09-22 89 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。

相关问题