Несколько липких объектов одного класса?

Я использую липкие события в EventBus, чтобы передать мои «выбранные» объекты в предстоящее действие. Подробная активность позволяет пользователю «выбрать» другой объект для получения нового списка. Я хочу опубликовать еще одно закрепленное событие с тот же классом объектов еще раз в другой активности списка, но, насколько я понимаю, предыдущее закрепленное событие будет перезаписано. См. иллюстрацию примера внизу.

Каков рекомендуемый способ решения этой проблемы? Мне нужно иметь n-вложенные липкие события с тем же классом в EventBus.

Мне очень нравится иметь липкие объекты, это избавило меня от необходимости вручную подключать интерфейс Android Parcelable только для отправки объектов из одной живой активности в другую с помощью механизма Intent. Я бы не хотел, чтобы меня заставляли идти и реализовывать Parcelable даже после получения полностью работающего EventBus только потому, что я не могу иметь вложенные липкие объекты!

Один из способов, который я придумал, состоял в том, чтобы поддерживать свой собственный стек объектов Item в ArrayList в синглтоне, нажимая при погружении глубже (до startActivity) и выталкивая при откате (но где? onDestroy не следует использовать), но подход кажется очень хрупкий для меня. Мне нужен надежный механизм — это основная навигационная точка для моего приложения.

  • Список элементов, пользователь выбирает Item. Мы публикуем закрепленное событие с этим Item и startActivity с классом подробного представления в Intent.
  • Пользователь просматривает детали и запрашивает список связанных элементов. Мы начинаем другую активность, показывающую список.
  • Пользователь выбирает Item. Мы публикуем закрепленное событие с этим секундным Item и startActivity с классом подробного представления в Intent. Второй Item перезаписывает первый Item, и когда пользователь хочет перейти вверх по заднему стеку, он больше не доступен для чтения, вместо этого читается последний созданный закрепленный элемент.

person Dhiraj Gupta    schedule 26.02.2015    source источник


Ответы (2)


Глядя на источник https://github.com/greenrobot/EventBus/blob/master/EventBus/src/de/greenrobot/event/EventBus.java

строка 52:

private final Map<Class<?>, Object> stickyEvents;

Он использует класс в качестве ключа, поэтому я не думаю, что это можно сделать, но я подумал об обходном пути.

Вы можете сделать что-то подобное ниже, когда вы настраиваете свои данные:

Map<String, List> data = new HashMap<>();
data.put("CLASS_A", objectA);
data.put("CLASS_B", objectB);
EventBus.getDefault().postSticky(scheduleData);

На принимающей стороне:

Map<String, List> data = EventBus.getDefault().getStickyEvent(HashMap.class);
objectA = data.get("CLASS_A");
objectB = data.get("CLASS_B");

Это похоже на намерение, но по крайней мере кодов меньше, и вы получите выигрыш в скорости.

person pjwin    schedule 15.07.2015
comment
Это похоже на то, что я в итоге сделал, но вместо этого я создал класс StatusEvent, внутри которого была карта. Все события в моем приложении транслируются в этом же классе. Все заинтересованные обработчики событий проверяют объект StatusEvent, чтобы определить, действительно ли событие является тем, чего ожидает обработчик, и действуют соответствующим образом. Это работает, но все еще кажется... неуклюжим. - person Dhiraj Gupta; 16.07.2015

Мне очень нравится иметь липкие объекты, это избавило меня от необходимости вручную подключать интерфейс Android Parcelable только для отправки объектов из одной живой активности в другую с помощью механизма Intent. Я бы не хотел, чтобы меня заставляли идти и реализовывать Parcelable даже после получения полностью работающего EventBus только потому, что я не могу иметь вложенные липкие объекты!

EventBus не предназначен для использования вместо намерений и пакетов. Вы должны отправлять информацию из одного действия в другое, используя Intent и помещая соответствующие параметры в Bundle. Если вы не хотите сами писать весь код Parcelable и Serializable (что я могу полностью понять), загляните на https://projectlombok.org/ это потрясет ваш мир. Вы можете реализовать разделяемость и сериализацию с помощью одной аннотации.

person shredder    schedule 26.02.2016