Обновление объекта, хранящегося в одном действии, из другого действия

#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 или базовой платформе.