#android #android-activity
#Android #android-действие
Вопрос:
Я создаю объект с именем «AppEngine» внутри моего первого действия. Этот объект AppEngine хранит и ArrayList событий и начинается с 2 событий внутри него.
Из первого действия я нажимаю кнопку, которая приводит меня ко второму действию, в котором я добавляю объект события в ArrayList с помощью.
appEngine.getList.add(new Event)
Когда внутри действия 2, если я должен вызвать appEngine.getList.size()
, размер правильно возвращается как 3, и я вижу дополнительное событие.
Когда я переключаюсь обратно на действие 2, я вызываю appEngine.getList.size()
, однако он возвращает только 2, и дополнительного события там нет. Как я могу обновить объект AppEngine?
Комментарии:
1. Я предполагаю, что вы передаете список, используя api putParcelableArrayListExtra() намерения?
2. Сам массив не передается, приложение передается с помощью bundle.putSerializable(«AppEngine», AppEngine»). Это помещает весь движок в действие 2, а метод getList вызывается внутри действия 2.
3. неправильно введите один из них? «Когда внутри действия 2» и «Когда я переключаюсь обратно на действие 2»
4. Итак, проблема в том, что когда вы вызываете getSerializable в Activity2, он возвращает другой экземпляр AppEngine, и когда вы возвращаетесь к Activity1, размер списка внутри AppEngine по-прежнему равен 2. Одним из решений вашей проблемы является объявление вашего класса AppEngine как одноэлементного и не передавайте его с помощью putSerializable API, вместо этого используйте экземпляр Singleton и обновите список.
Ответ №1:
сохраните свой список массивов в общих настройках следующим образом создайте класс AppPreference:-
public class AppPreference {
private static SharedPreferences mPrefs;
private static SharedPreferences.Editor mPrefsEditor;
public static Set<AppEngine> getList(Context ctx) {
mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
return mPrefs.getStringSet("AppEngineList", null);
}
public static void setList(Context ctx, ArrayList<AppEngine> value) {
mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
mPrefsEditor = mPrefs.edit();
Set<String> set = new HashSet<>();
set.addAll(value);
mPrefsEditor.putStringSet("AppEngineList", set);
mPrefsEditor.commit();
}
}
установите значение из первого действия следующим образом:-
setList(YourActivity.class, list);
и получите свой список из любого места в вашем приложении:-
ArrayLis<AppEngine> list = AppPreference.getList(yourActivity.class);
Комментарии:
1. В каком действии мне создать класс AppPreference и как мне получить к нему доступ из второго действия?
2. вы должны создать класс Java в своем пакете. на самом деле вы можете использовать общие настройки, такие как мини-база данных, в вашем aap. это лучший способ сохранить значения в вашем приложении и получить эти значения оттуда, откуда вы хотите
3. это фактически сохранит данные в локальном хранилище на телефоне, что может быть излишним? это означает, что состояние данных будет фактически сохраняться при полном закрытии приложения, а не просто при переключении между действиями
4. настройте код в соответствии с вашей ситуацией, и вам обязательно понравится этот код
Ответ №2:
Если вы хотите, чтобы объект appEnginge сохранялся только в течение одного сеанса приложения, а не сохранялся после полного закрытия / перезапуска приложения, вам следует использовать класс обработчика.
EngineHandler.java:
public static class engineHandler {
public static appEnginge _appEngine;
}
а затем просто вызовите
engineHandler._appEngine = _myAppengine;
engineHandler._appEngine.getList().add(new Event);
из ваших действий. Обработчик движка будет доступен из любого действия в вашем приложении.
Комментарии:
1. Я пытаюсь реализовать этот код, но получаю сообщение об ошибке, в котором говорится, что статика здесь не разрешена.
Ответ №3:
Вы можете использовать одноэлементный шаблон проектирования.
Вы создаете один объект из AppEnginRepository с полем EventList, и в своем приложении вы просто получаете его и каждый раз, когда хотите, меняете его.
public class AppEnginRepository {
private List<Event> eventList;
private static final AppEnginRepository ourInstance = new AppEnginRepository();
public static AppEnginRepository getInstance() {
return ourInstance;
}
private AppEnginRepository() {
eventList = new ArrayList<>();
}
public List<Event> getEventList() {
return eventList;
}
public void setEventList(List<Event> eventList) {
this.eventList = eventList;
}
}
В ваших действиях
AppEnginRepository enginRepository=AppEnginRepository.getInstance();
List<Event> eventList=enginRepository.getEventList();
eventList.add(new Event());
int eventListSize=eventList.size();
Ответ №4:
Было бы хорошо думать, что каждое действие полностью отделено от выполнения. Технически это спорно, но это хорошее предположение для разработки более чистого и безопасного программного обеспечения.
Учитывая предположение, существует несколько подходов для хранения данных во всех действиях в приложении.
- В качестве ответа @Sandeep Malik используйте хранилище SharedPreference, заданное операционной системой.
- Аналогично ответу @Joachim Haglund, используйте одноэлементный шаблон для поддержания объекта в приложении.
- Или используйте небольшую базу данных, такую как Realm.
Каждый подход имеет схожий способ; должно быть изолированное и независимое хранилище, которое не принадлежит одному из Activity, а принадлежит ApplicationContext или базовой платформе.