SharedPreferences getString虽然由AsyncTask中的编辑器设置,但仍返回null

时间:2014-09-22 07:13:23

标签: android sharedpreferences

我有LoginActivity调用AsyncTask向服务器发布用户名和密码,在回复时,它会将用户名写入SharedPreferences(可以在此处从SP检索用户名)并返回至应用程序的MainActivity。但是,我在MainActivity中从SP检索用户名,它是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" />

2 个答案:

答案 0 :(得分:4)

问题是你使用了错误的方法:getPreferences(int mode)。请参考文件: http://developer.android.com/reference/android/app/Activity.html#getPreferences(int)

“这只是通过传入此活动的类名作为首选项名称来调用底层的getSharedPreferences(String,int)方法。”

因此,在您的代码中,用于保存数据的首选项文件名可能是“LoginActivity”,因为您将其保存在LoginActivity类中。然后,当您使用getPreferences(int模式)在MainActivity类中获取数据时,意味着您希望从名为“MainAcitity”的首选项文件中获取数据。所以,你必须得到一个null。

如何解决您的问题: 使用getSharedPreferences(String,int)方法而不是getPreferences(int模式),并在两个Activity类中提供保存首选项文件名。

答案 1 :(得分:2)

使用getSharedPreference方法而不是getPreference。