RxBus: отправка общих событий

У меня есть общий Event класс, который я хочу опубликовать на PublishRelay это действует как мой автобус.

Я хочу сделать мой RxBus отправлять события общего типа, но сама шина не является общей. Можете ли вы дать мне идеи о том, что мне нужно изменить?

public class Event<T> {
  protected String name;
  protected Pair<String, T> event;

  public String getName() {
    return event.first;
  }

  public T getData() {
    return event.second; //cast to type
  }

  public Event(String name, T data) {
    event = Pair.create(name, data);
  }
}

@Singleton
public class RxBus {

    // I want to post Event<T>
  private final PublishRelay<Event<User>> busSubject = PublishRelay.create();

  public PublishRelay<Event<User>> bus() {
    return busSubject;
  }

  public void post(Event<User> event) {
    busSubject.accept(event);
  }
}

1 ответ

Если вы хотите использовать общие события, вы можете просто использовать ? подстановочный знак для определения этого. Но тогда у вас нет информации о фактическом типе T в подписчике. Вы бы справились с этим по-другому. Может быть, фильтр или приведение. Также может быть нехорошо сделать PublishRelay доступны снаружи. возврате Observable скрыл бы эту деталь реализации.

@Singleton
public class RxBus {

  private final PublishRelay<Event<?>> busSubject = PublishRelay.create();

  public Observable<Event<?>> bus() {
    return busSubject;
  }

  public void post(Event<?> event) {
    busSubject.accept(event);
  }
}
Другие вопросы по тегам