【发布时间】:2014-12-21 16:44:33
【问题描述】:
这是我的 MainActivity.java,我在其中实例化静态 SharedPreferences 及其编辑器:
public static SharedPreferences settings;
public static SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
settings = PreferenceManager.getDefaultSharedPreferences(this);
editor = settings.edit();
然后我对另一个 java 类进行 AsyncTask 调用,在该类中我尝试将 onPostExecute 方法中的令牌存储到此 SharedPreferences。
@Override
protected void onPostExecute(String result) {
MainActivity.editor.putString("auth_token", result);
MainActivity.editor.commit();
Log.d("token", MainActivity.settings.getString("auth_token", "Nothing"));
}
这个 Log.d() 方法输出控制台中的令牌值,即“OK”。但随后我启动了一个活动 Next.java,我尝试在屏幕上使用此令牌:
TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
String auth_token_string = MainActivity.settings.getString("auth_token", "Nothing");
text = (TextView) findViewById(R.id.logintxt);
text.setText(auth_token_string);
屏幕上的结果是默认的字符串“Nothing”。
我在这里做错了什么? ...这是使用 SharedPreferences 的正确方法吗?我在topic 中得到了这个想法。
编辑:
来自我调用 asyncTask 的 AuthorizeActivity.java 的代码:
public void getToken(String code){
AsyncTask<String, Void, String> tsk = new Api().execute(code);
Intent i = new Intent(this.getBaseContext(), Next.class);
dialog.dismiss();
startActivity(i);
}
【问题讨论】:
-
你能发布完整的代码(你调用 asyncTask 的地方)吗?
-
见您的
.commit()呼叫正在返回true以成功保存。您可以尝试将.commit()替换为apply()。按照设计,这不会返回任何内容,但它是自 2.3 以来添加的方法。 -
@issathink - 我从 AuthorizeActivity.java 调用 asynctask - 你可以看到上面更新的代码。
-
@JASONGPETERSON - 出于这个原因,我打印了 Log.d(),其中我从“MainActivity.settings.getString("auth_token", "Nothing")" 获取值。但无论如何, .commit() 正在返回 true
-
我很确定您通过持有
Object的静态引用来泄漏您的Activity,您将向该引用传递您的Activity的实例。传递ApplicationContext而不是this。
标签: java android sharedpreferences