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。