RxJava как шина событий?

Я начинаю изучать RxJava, и мне это нравится. У меня есть фрагмент, который связывается с активностью при нажатии кнопки (чтобы заменить текущий фрагмент новым фрагментом). Google рекомендует интерфейс для фрагментов для связи до активности, но он слишком подробный, я пытался использовать широковещательный приемник, который работает в целом, но у него были недостатки.

Поскольку я изучаю RxJava, я задаюсь вопросом, является ли это хорошим вариантом для общения от фрагментов к действиям (или фрагменту к фрагменту) ?. Если да, то какой способ использовать RxJava для такого типа общения? Нужно ли мне делать такую ​​шину событий, как этот, и если это так, я должен сделать один экземпляр шины и использовать ее глобально (с темами)?

Да, и это потрясающе, когда вы узнаете, как это сделать. Рассмотрим следующий одноэлементный класс:

public class UsernameModel { private static UsernameModel instance; private PublishSubject<String> subject = PublishSubject.create(); public static UsernameModel instanceOf() { if (instance == null) { instance = new UsernameModel(); } return instance; } /** * Pass a String down to event listeners. */ public void setString(String string) { subject.onNext(string); } /** * Subscribe to this Observable. On event, do something eg replace a fragment */ public Observable<String> getStringObservable() { return subject; } } 

В вашей деятельности вы можете получать события (например, иметь в onCreate):

 UsernameModel usernameModel = UsernameModel.instanceOf(); //be sure to unsubscribe somewhere when activity is "dying" eg onDestroy subscription = usernameModel.getStringObservable() .subscribe(s -> { // Do on new string event eg replace fragment here }, throwable -> { // Normally no error will happen here based on this example. }); 

В Fragment пропустите событие, когда это произойдет:

 UsernameModel.instanceOf().setString("Nick"); 

Тогда ваша деятельность сделает что-то.

Совет 1: Измените строку с любым типом объекта, который вам нравится.

Совет 2: Он отлично работает, если у вас есть инъекция зависимостей.

В настоящее время я считаю, что мой предпочтительный подход к этому вопросу заключается в следующем:

1.) Вместо одной глобальной шины, которая обрабатывает все приложение (и, следовательно, становится довольно громоздкой), используйте «местные» шины для четко определенных целей и только подключайте их туда, где они вам нужны.

Например, у вас может быть:

  • Одна шина для отправки данных между вашей Activity и вашим ApiService .
  • Одна шина для связи между несколькими Fragment в Activity .
  • Одна шина, которая отправляет выбранный в данный момент цвет темы приложения для всех Activity s, чтобы они могли подкрасить все значки соответственно.

2.) Используйте Кинжал (или, возможно, AndroidAnnotations, если вы этого предпочтете), чтобы сделать проводку-все вместе немного менее болезненным (а также избежать множества static экземпляров). Это также упрощает работу, например, с одним компонентом, который имеет дело только с хранением и чтением статуса входа в SharedPreferences – этот компонент также может быть подключен непосредственно к вашему ApiService чтобы предоставить токен сеанса для всех запросов.

3.) Не стесняйтесь использовать Subject внутри, но «отбросьте» их на « Observable прежде чем передать их публике, вызвав return subject.asObservable() . Это не позволяет другим классам вставлять значения в Subject где им не разрешено.