#android #sharedpreferences #android-service
#Android #sharedpreferences #android-сервис
Вопрос:
Я использую сервис для загрузки и извлечения списка URL-адресов и помещаю их в sharedpreference.
С этим..
SharedPreference images_article = this.getSharedPreferences("images_articles", MODE_WORLD_READABLE);
editor.putString("article2", urlImage2);
editor.putString("article3", urlImage2);
editor.commit();
Затем в моем основном.Действие я извлекаю URL из предпочтений.
SharedPreference images_article = this.getSharedPreferences("images_articles", MODE_WORLD_READABLE);
urlImage2 = images_article.getString("article2", "NO ARTICLE AVAILABLE");
urlImage3 = images_article.getString("article3", "NO ARTICLE URL AVAILABLE");
Единственная проблема заключается в том, что по какой-то причине он не входит в общие настройки, потому что основным действием является загрузка СТАРОГО URL-адреса, который теперь изменился. Но в сервисе я регистрирую извлекаемые URL-адреса, и они обновляются, но по какой-то причине в основном действии он по-прежнему загружает старый. и я извлекаю их из одного и того же предпочтения.
Есть ли что-то, чего мне не хватает, или лучший способ сделать это? Любая помощь была бы отличной!!
Комментарии:
1. Как вы получаете
editor
объект?
Ответ №1:
Я столкнулся с аналогичной проблемой с моими SharedPreferences между моей деятельностью и сервисом. В итоге я не использовал значение по умолчанию и использовал свое собственное заданное имя файла
в заданном мной действии и службе
private static final String PREFERENCE_NAME = "MyPreferenceFileName";
Затем, чтобы получить значения:
SharedPreferences pref = getSharedPreferences(PREFERENCE_NAME, Activity.MODE_PRIVATE);
pref_checked = pref.getBoolean("checked", true);
и установить значения:
SharedPreferences pref = getSharedPreferences(PREFERENCE_NAME, Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putBoolean("checked", value);
editor.commit();
Это позволило мне использовать одну и ту же логику get и put как в моем сервисе, так и в Activity без каких-либо проблем. Надеюсь, это помогло.
Комментарии:
1. Хотя это может сработать, можно использовать общие настройки по умолчанию для и activity, и service. SP по умолчанию просто используют определенное имя — в них нет ничего особенного.
2. Согласен здесь с @DavidCaunt. Я столкнулся с аналогичной проблемой, и, похоже, это проблема времени. Мое основное действие, которое использует значение настройки, получает старое значение несколько раз, но когда оно возобновляется, оно получает правильное значение. Я считаю, что мое основное действие считывает SP до того, как другой сохранит его, или каким-то образом кэширует значения. У кого-нибудь есть идеи? Я пытаюсь получить значение для метода resume.
Ответ №2:
Это может происходить из-за разных контекстов, из которых вы получаете доступ. Я не очень уверен, но вы можете попробовать это :
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = sp.edit();
Используйте этот код всякий раз, когда вы пытаетесь получить доступ SharedPreferences
, то есть как из, так Service
и из Activity
. Это может решить вашу проблему.
Комментарии:
1. Столкнулся с этой проблемой с действием и службой, работающими на Android Wear. По какой-то причине объект SharedPreferences отличался в сервисе и activity. Приведенное выше решение устранило проблему. Я не уверен, почему контекст был другим.
Ответ №3:
Использование этого как в классах Activity, так и в Service, похоже, работает для меня, поскольку теперь он должен использовать один и тот же контекст для доступа к разделяемым ссылкам приложения:
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());