2011-08-11 2 views
2

Я сохраняю имя пользователя и пароль при первом открытии приложения и сохраняю его в объекте SharedPreferences. Я проверяю данные во второй раз, когда он вводит, и если это не null, то я попал в приложение. Вот как я это делаю:
Общие настройки андроида Основной вопрос

private SharedPreferences dhj; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    dhj = this.getSharedPreferences("DHJ", MODE_WORLD_READABLE); 
    if(dhj.getString("username", null) != null) { 
     setContentView(R.layout.main); 
      // do some stuff... 
    } 
    else { 
      setContentView(R.layout.login); 
      username = (EditText) findViewById(R.id.username); 
      password = (EditText) findViewById(R.id.password); 
        loginButton = (Button) findViewById(R.id.loginButton); 

      loginButton.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        SharedPreferences.Editor dhjEditor = dhj.edit(); 
        dhjEditor.putString("username", username.getText().toString()); 
        dhjEditor.putString("password", password.getText().toString()); 
        setContentView(R.layout.main); 
       } 
      }); 
        // do some other stuff... 
    } 
} 

Но каждый раз, когда я открываю приложение, меня просят ввести имя пользователя и пароль.
Что я делаю неправильно? Как я могу достичь желаемой функциональности?
Спасибо.

+0

вы можете разместить код, где вы храните пароль и имя пользователя, пожалуйста? –

+0

Как вы сохраняете имя пользователя и пароль в настройках? – binnyb

+4

Не показано, были ли вы сохранить имя пользователя и пароль в SharedPreferences. Вероятно, ваша проблема связана с тем, что вы не вызываете .commit(); – Blundell

ответ

1

После внесения любых изменений в настройки вам необходимо вызвать метод редактора commit. Это позволит сохранить файл настроек:

SharedPreferences.Editor dhjEditor = dhj.edit(); 
dhjEditor.putString("username", username.getText().toString()); 
dhjEditor.putString("password", password.getText().toString()); 
dhjEditor.commit(); 
+0

Спасибо. Кстати, мой код для проверки правильности введенного пользователем пароля? – Brahadeesh

+0

выглядит хорошо, хотя если пользователь ничего не вводит и нажимает кнопку входа в систему, он будет отображаться как выполненный вход. Пустые строки будут сохранены как имя пользователя/пароль. вы можете выполнить некоторую проверку перед сохранением в prefs – binnyb

+0

oh. Спасибо. сделают это. – Brahadeesh

2

Док из "getSharedPreferences" говорит:

Желаемая предпочтения файла. Если файл предпочтений по этому имени не существует, он будет создан при получении редактора (SharedPreferences.edit()), а затем зафиксирует изменения (Editor.commit()).

Удостоверьтесь, что вы используете тот же самый редактор для всех записей перед фиксацией, например.

Editor editor = mPref.edit(); 
editor.putString("username", username); 
editor.putString("password", password); 
editor.commit(); 
3

Обратите внимание, что функция editor.commit() является синхронной функцией, которая выполняет операцию файловой системы. Вызов этого из основного потока (ваш код, кажется, запускается в основном потоке) может - в неприятных ситуациях - выбросить ANR, так как операции файловой системы могут блокироваться и тем самым блокировать основной поток.

Вместо этого я использовал бы функцию editor.apply(), так как она немедленно обновит кеш памяти в ваших общих настройках, а затем создаст рабочий поток и напишет значения в ваш файл общих настроек (рабочие потоки не блокируют основной поток).

http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply()