Использует ли библиотека событий, например Otto или EventBus, рекомендуемый способ обработки отношений между действиями, фрагментами и фоновыми потоками

В большинстве случаев при рассмотрении дела

  • Пользовательский поток (AsyncTask) для выполнения фоновой обработки
  • Передать вычисленный результат обратно в Activity или Fragment
  • Activity или Fragment повторное создание может произойти до того, как пользовательский поток завершит свою фоновую обработку.

На данный момент из многих надежных источников я вижу, что рекомендуемым способом является использование Retained Fragment.

Источники

Время от времени я слышал, что библиотеки шины событий хороши для обработки отношений между действиями, фрагментами и фоновыми потоками. (См. https://github.com/greenrobot/EventBus. Там указано, что выполняет хорошо с действиями, фрагментами и фоновыми потоками)

Я наткнулся на несколько действительно популярных библиотек шины событий.

Мне было интересно, когда дело доходит до обработки отношений между действиями, фрагментами и фоновыми потоками, чем подход шины событий отличается от подхода Retained Fragment?

Какие способы являются рекомендуемыми?


person Cheok Yan Cheng    schedule 05.03.2015    source источник


Ответы (4)


Шина событий и Otto не являются «рекомендованными способами» в руководстве для разработчиков Android, прежде всего потому, что они являются сторонними библиотеками для упрощения задачи. И я считаю, что Отто довольно новый, поэтому старые руководства, очевидно, не используют его.

Мне лично нравится Otto, я им пользуюсь, и пока у меня не было с ним никаких проблем. Но, конечно, это потому, что это подходило для моих вариантов использования.

У меня есть пример того, как я использовал Отто здесь.

РЕДАКТИРОВАНИЕ из будущего: если вам нужна шина событий, greenrobot/EventBus лучше чем Отто. Кроме того, в некоторых случаях вместо использования события вполне достаточно LiveData<T>. bus (который вместо того, чтобы посылать события кому-либо, отправляет только подписчикам).

person EpicPandaForce    schedule 05.03.2015
comment
Получаются ли события только при выполнении фрагмента/активности? Я имею в виду после onResume() и до onPause()? Кажется, у меня есть случай, когда мои фрагменты получают сообщение после onPause(), что плохо! - person Yar; 23.11.2015
comment
@Yar Я знаю это чувство, поэтому у меня есть очередь событий для публикации в основной поток: stackoverflow.com/a/28480952/ 2413303 (примечание: это НИКАК не сохраняется при смерти процесса!) - person EpicPandaForce; 23.11.2015
comment
Так что я правильно понял: обычно Отто отправляет события на приостановленные фрагменты... - person Yar; 23.11.2015
comment
Ну, если вы не заблокируете его, да. Некоторые люди регистрируются/отменяются в onResume и onPause, но событие будет потеряно. Вот почему я лично разрешаю отправлять события, только если paused равно false. - person EpicPandaForce; 23.11.2015
comment
Я думаю, что EventBus на самом деле лучше, чем Otto, теперь, когда я использовал оба. - person EpicPandaForce; 29.01.2016
comment
@EpicPandaForce Я согласен, обналиченные (липкие) события - бесценная функция. - person Jack.Ramsden; 03.03.2016
comment
Небольшое обновление: согласно этому объявлению, Otto выведен из эксплуатации с августа 2016 года. - person naXa; 05.10.2016
comment
@naxa Я говорю об этом Otto, хотя он уже устарел в пользу Rx, и EventBus3 в любом случае лучше: github.com/square/otto - person EpicPandaForce; 05.10.2016

Мне было интересно, когда дело доходит до обработки отношений между действиями, фрагментами и фоновыми потоками, чем подход шины событий отличается от подхода с сохраненным фрагментом?

Какие способы являются рекомендуемыми?

Я думаю, вы неправильно понимаете два понятия:

1) предотвращение повторного создания задачи при повороте устройства

2) отправка сообщений из потока в активность или из службы во фрагмент или...

Когда мы помещаем задачу внутрь фрагмента, мы просто не хотим запускать ее снова, если мы вращаемся. Также мы хотим получить от него результат, например, мы хотим обновить imageView, но если вы передаете imageView в асинтаск, а затем поворачиваете свое устройство, если вы сохраняете imageView как слабую ссылку, тогда ваш imageView становится нулевым после того, как действие уничтожено, и если вы сохраните его как сильную ссылку, вы пропустите активность. поэтому лучше поместить его внутрь фрагмента и сохранить представление как слабую ссылку, и если действие onCreate вызывается обновлением этой ссылки.

EventBus и Otto — очень хорошие библиотеки для отправки сообщений между любыми компонентами или потоками. вы можете использовать те или собственные решения для Android, такие как создание интерфейса или localBroadcastManager или обработчика.

чем подход шины событий отличается от подхода Retained Fragment?

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

person mmlooloo    schedule 08.03.2015
comment
Используя метод слабой ссылки, вы можете предотвратить вызов AsyncTask недопустимого пользовательского интерфейса, но ваша AsyncTask не сможет взаимодействовать с воссозданным пользовательским интерфейсом. Либо сохраненный фрагмент экземпляра, либо шина событий могут преодолеть этот недостаток. - person Cheok Yan Cheng; 09.03.2015
comment
Я бы предпочел использовать asynctask с LruCache, поэтому, если вы вызовете его снова, он просто немедленно доставит результат. - person mmlooloo; 09.03.2015

Связь между простыми Activity и Fragment может быть легко установлена ​​разными способами, но самый элегантный способ — создать и использовать простой класс interface. Но для такого сценария, как активность, в которой размещен фрагмент, который показывает другие фрагменты с помощью viewpager, тогда этот дочерний фрагмент должен связаться с родительской активностью или фрагментом, именно здесь можно использовать EventBus, поскольку не будет способ, с которым вы можете общаться. EventBus следует использовать только тогда, когда нет другого способа отправить данные в другой класс.

person Mihae Kheel    schedule 02.10.2019

EventBus как всегда лучший.

Otto больше не поддерживается.

По этой ссылке otto:

Этот проект устарел в пользу RxJava и RxAndroid. Эти проекты поддерживают ту же модель программирования, управляемую событиями, что и Otto, но они более функциональны и предлагают лучший контроль над потоками.

Если вам нужно руководство по переходу с Otto на Rx, эта запись — хорошее начало.

person Pratik Butani    schedule 21.01.2020