Android 虽然编辑器在AsyncTask中设置了SharedReferences getString,但它返回null

Android 虽然编辑器在AsyncTask中设置了SharedReferences getString,但它返回null,android,sharedpreferences,Android,Sharedpreferences,我有一个LoginActivity,它调用一个AsyncTask向服务器发送用户名和密码,在响应时,它会将用户名写入SharedReferences(可以在这里从SP检索用户名)并返回到may app的main活动。但是,我在MainActivity中从SP检索用户名,它是null。我哪里做错了 异步任务代码: //activity is the context passed from LoginActivity (using "this") protected void onPostExecu

我有一个
LoginActivity
,它调用一个
AsyncTask
向服务器发送用户名和密码,在响应时,它会将用户名写入
SharedReferences
(可以在这里从SP检索用户名)并返回到may app的
main活动。但是,我在
MainActivity
中从SP检索用户名,它是
null
。我哪里做错了

异步任务代码:

//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();
        } 
    }
}
主要活动代码:

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" />

问题在于使用了错误的方法:getPreferences(int模式)。请参阅文件:

这只是通过传入此活动的类名作为首选项名称来调用基础GetSharedReferences(String,int)方法

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

如何解决您的问题:
使用GetSharedReferences(String,int)方法代替getPreferences(int模式),并在两个活动类中指定保存首选项文件名。

问题在于使用了错误的方法:getPreferences(int模式)。请参阅文件:

这只是通过传入此活动的类名作为首选项名称来调用基础GetSharedReferences(String,int)方法

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

如何解决您的问题:
使用GetSharedReferences(String,int)方法代替getPreferences(int模式),并在两个活动类中指定保存首选项文件名。

使用GetSharedReference方法代替getPreference

使用GetSharedReference方法而不是getPreference

您能确认dataJson返回的是正确的值,不是空值吗?是的,它是正确的。另外,在编辑器编写SharedReferences之后,我立即得到了它,并且它是正确的(请参见Log.d代码)。您的SharedReferences名称在哪里?请尝试使用此
SharedReferences设置=此.getSharedReferences(“您的首选名称”,0)确定…添加名称可能会起作用…我将getPreference误用为GetSharedReference。能否确认dataJson返回正确的值,而不是null?是的,它是正确的。另外,在编辑器编写SharedReferences之后,我立即得到了它,并且它是正确的(请参见Log.d代码)。您的SharedReferences名称在哪里?请尝试使用此
SharedReferences设置=此.getSharedReferences(“您的首选名称”,0)确定…添加名称可能有效…我将getPreference误用为GetSharedReference。