Как сохранить данные с помощью общих настроек в моем коде? - PullRequest
0 голосов
/ 15 февраля 2019

Я создаю приложение для Android, в котором я регистрируюсь через Facebook, и после доступа к Facebook я настраиваю свой навигационный ящик с URL-адресом пользователя Facebook и именем пользователя Facebook.когда я пытаюсь открыть свое приложение во второй раз, URL-адрес пользователя Facebook и имя пользователя Facebook не отображаются в окне навигации.

Я пытался использовать общие настройки, чтобы сохранить имя пользователя Facebook и URL-адрес изображения, но мне нужна помощьсейчас, потому что я старался, но этого не произошло.

    Bundle bundle = getIntent().getExtras();
    String id = bundle.getString("id");
    String name = bundle.getString("name");
    String image_url = "https://graph.facebook.com/" + id + "/picture?type=normal";

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString("name", name);
    editor.putString("url",image_url);
    editor.commit();

    final IProfile profile = new 
    ProfileDrawerItem().withName(prefs.getString("name",""))
            .withIcon(prefs.getString("url",""))
            .withIdentifier(100);

    AccountHeader headerResult = new AccountHeaderBuilder()
            .withActivity(this)
            .withTextColor(Color.BLACK)
            .withTranslucentStatusBar(true)
            .addProfiles(profile)
            .build();

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Вы должны сохранить данные следующим образом:

SharedPreferences prefs = getSharedPreferences("MyPrefs", MODE_PRIVATE)
SharedPreferences.Editor editor = prefs.edit();
editor.putString("name", name);
editor.putString("url",image_url);
editor.commit();

и получить свои данные:

SharedPreferences prefs = getSharedPreferences("MyPrefs", MODE_PRIVATE)
String name = perfs.getString("name","");
String url  = perfs.getString("url","");
0 голосов
/ 15 февраля 2019

Код настроек на самом деле выглядит хорошо.Поэтому я подозреваю, что проблема на самом деле кроется в другом месте.

Вы действительно пытались записать результат prefs.getString("url", "") или prefs.getString("name", "") на консоль, чтобы проверить, можно ли что-нибудь получить?

Ваша проблемаможет даже быть от "выше" в вашем коде ... вы действительно убедились, что bundle.getString("id") и bundle.getString("name") возвращают ожидаемые вами данные?

При этом есть несколько вещей, которые выможет улучшить читаемость и стабильность кода SharedPreferences.

Объявите настройки как поле класса.

public class YourActivity extends Activity {       

    private SharedPreferences userPreferences;


    @Override
    public void onCreate (Bundle savedInstanceState) {
        userPreferences = getSharedPreferences("USER_DATA", Context.MODE_PRIVATE);

        // ...
    }

    // ...
}

Вам не нужно хранить ссылку на экземпляр SharedPreferences.Editor, потому что все операции put возвращают одну.Таким образом, вы можете объединить вызовы:

userPreferences.edit()
        .putString("name", name)
        .putString("url", image_url)
        .commit();

Если вы не можете заставить его работать так, как это, вы можете проверить возвращенное логическое значение приведенного выше вызова.SharedPreferences.Editor::commit на самом деле вернет логическое значение, которое означает, была ли запись успешной (true) или неудачной (false).
В общем, я бы посоветовал использовать apply() вместо commit(), потому чтоэто не блокирует.Т.е. изменения будут записаны в память, а затем записаны на диск, запланированный ОС.В настоящий момент фиксация блокирует ваш поток пользовательского интерфейса, что может вызвать проблемы с производительностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...