无法在AsyncTask中设置SharedPreferences?

时间:2014-02-17 19:26:34

标签: android android-asynctask sharedpreferences

我正在尝试在我的asynctask中设置共享首选项,但它似乎无法正常工作。任何人都可以帮助我。我已经尝试过十亿件事了

按钮/ ASYNC代码:

    button.setOnClickListener(new OnClickListener(){
        private ProgressDialog cancelDialog = null;
        int valid;

        @Override
        public void onClick(View arg0) {
            new AsyncTask<Void, Void, Void>() {
                @Override
                protected Void doInBackground(Void... params) {
                    valid = api.validateLogin(username.getText().toString(), password.getText().toString());
                    return null;
                }


                @Override
                protected void onPreExecute() {
                    cancelDialog = new ProgressDialog(LoginActivity.this);
                    cancelDialog.setMessage("Validating Username & Password");
                    cancelDialog.show();

                    super.onPreExecute();
                } 

            @Override
                protected void onPostExecute(Void result){
                    cancelDialog.cancel();
                    if(valid == 2){
                        SharedPreferences savedSession = getApplicationContext().getSharedPreferences("xdaeaf", Activity.MODE_PRIVATE);
                        savedSession.edit().putString("username", username.getText().toString());
                        try {
                            String passtext = MCrypt.bytesToHex(mcrypt.encrypt(password.getText().toString()));
                            savedSession.edit().putString("password", ""+passtext);
                            savedSession.edit().commit();
                    } catch (Exception e) {
                        e.printStackTrace();
                            //TODO:
                    }

                        //TODO: 
                    }else{
                        //TODO:
                    }

                    super.onPostExecute(result);
                }

            }.execute();    
        }
    });

我的访问代码:

    SharedPreferences savedSession = context.getSharedPreferences("xdaeaf", Activity.MODE_PRIVATE);
    String username = savedSession.getString("username", "");
    String password = savedSession.getString("password", "");
    System.out.println("username:"+username+" password:"+password);

我检查了我是否将空变量传递给putSTring,但是它将值传递给它。它只是没有储蓄。当我重新运行访问代码时,它只打印出“用户名:密码:”。尝试重新访问时,这些值为空。

2 个答案:

答案 0 :(得分:4)

savedSession.edit().putString("username", username.getText().toString());

每次调用edit()都会返回一个新的Editor实例。所以你得到一个实例,做出改变并不管它。然后你得到第二个并且在没有更改的情况下提交它,这导致首选项中没有值更改。

Editor editor = savedSession.edit();
editor.putString("username", username.getText().toString());
editor.putString("password", ""+passtext);
editor.commit();

答案 1 :(得分:1)

如果您每次都调用savedSession.edit(),那么它会返回不同的对象,那么您必须在每个对象上调用commit方法来保存值。

所以得到Editor这样的一个实例

Editor editor = savedSession.edit();

然后使用此引用来保存值。

您的代码应为

Editor editor = savedSession.edit();
editor.putString("username", username.getText().toString());
String passtext = MCrypt.bytesToHex(mcrypt.encrypt(password.getText().toString()));
editor.putString("password", ""+passtext);
editor.commit();