Общие предпочтения Android основной вопрос - PullRequest
2 голосов
/ 11 августа 2011

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

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...
    }
}

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

Ответы [ 3 ]

3 голосов
/ 12 августа 2011

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

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

2 голосов
/ 11 августа 2011

Документ getSharedPreferences гласит:

Файл требуемых настроек.Если файл настроек с таким именем не существует, он будет создан при извлечении редактора (SharedPreferences.edit ()) и последующей фиксации изменений (Editor.commit ()).

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

Editor editor = mPref.edit();
editor.putString("username", username);
editor.putString("password", password);
editor.commit();
1 голос
/ 11 августа 2011

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

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