Я начал использовать OTTO by Square вчера, пока что у меня было хорошее начало.
Otto отлично работает из коробки, когда ваши фрагменты уже размещены в FragmentActivity, и вам просто нужно общаться между фрагментами, размещенными в этой FragmentActivity.
Когда вы уже размещены, ваш метод #onResume() вызывается, и фрагмент может зарегистрироваться на Eventbus:
@Override
public void onResume()
{
super.onResume();
BusProvider.getInstance().register(this);
}
Моя проблема:
Фрагмент, встроенный в дополнительную активность, которая должна получать событие через Eventbus, выглядит следующим образом:
public AnotherFragmentHostedInSomeActivity extends Fragment
{
.....
@Subscribe
public void onSomethingHappend(final Event event)
{
final SomeObject deliveredObject = event.getSomeObject();
Но похоже, что все еще сложно, когда вы хотите вызвать другую активность, содержащую фрагмент, подобный этому коду:
public class SomeFragmentSendingDataToAnotherFragment extends Fragment
{
...
private void sendData()
{
final Intent intent = new Intent(applicationContext, SomeActivity.class);
applicationContext.startActivity(intent);
BusProvider.getInstance().post(new Event(someObject));
Как вы уже могли заметить, этот код хитрый. Запуск действия, а затем отправка данных во фрагмент, размещенный в этом действии, не может работать из-за жизненного цикла. Таким образом, создается действие и фрагменты. В какой-то момент вызывается метод onResume, чтобы фрагмент мог зарегистрироваться с помощью @Subscribe. Но все это происходит после того, как событие уже опубликовано через EventBus. Таким образом, фрагмент, представляющий интерес, никогда не вызывается EventBus.
Кто-нибудь знает, как это сделать по-умному?
Немного дополнительной информации: Вчера у меня была хорошая игра с OTTO. Проблема возникает только в моем проекте, когда мне нужно отправить данные в другое действие, что в моем случае происходит всегда, когда приложение работает на смартфоне, а не на планшете. Прежде чем я отправлю все данные через Intent и Parcelable. Отто уменьшит необходимость написания Parcleable Objects, поэтому я хотел бы пойти по этому пути.
Спасибо за ответы