我有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" />
答案 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。