Я новичок в RxJava и собираюсь внести некоторые улучшения в общую кодовую базу.Есть глубоко вложенные функции обратного вызова, от которых я бы хотел избавиться.До сих пор в моем исследовании RxJava я видел много примеров с успехом / ошибкой, но не один с несколькими функциями.Вот пример:
public interface OnEventListener {
void event0(Data data);
void event1(Data data);
void event2(Data data);
void event3(Data data);
}
private OnEventListener onEventListener = new OnEventListener {
@Override
public void event0(Data data) {
//Update UI
}
@Override
public void event1(Data data) {
//Push event to server
}
@Override
public void event2(Data data) {
//Update UI
}
@Override
public void event3(Data data) {
//Push event to server
}
}
...
onEventListener.event0(new Data(...);
......
Каждое событие может инициировать различные действия, такие как изменения пользовательского интерфейса или аналитические вызовы на сервер.Данные из вызывающего класса и родительского класса необходимы для выполнения действия.События все связаны.Их можно вызывать в любом порядке, и они будут вызываться в течение всего жизненного цикла приложения несколько раз.Это решения, которые я придумал, основываясь на моих минимальных знаниях RxJava.
public class EventModel {
private static EventModel instance;
public static EventModel getInstance() {
if (instance == null) {
synchronized (EventModel.class) {
if (instance == null) {
instance = new EventModel();
}
}
}
return instance;
}
private PublishSubject<Event> events = PublishSubject.create();
public void sendEvent(Event o) {
events.onNext(o);
}
public Observable<Event> getEvents() {
return events;
}
public enum EventType { EVENT_0, EVENT_1, EVENT_2, EVENT_3}
public class Event {
private Data data;
private EventType event;
public Event(EventType event, Data data) {
this.event = event;
this.data = data;
}
public EventType getEventType() {
return event;
}
public Data getData() {
return data;
}
}
}
...
eventModel.sendEvent(new Event(EventType.EVENT_0, new Data(...)));
...
eventModel
.getEvents()
.subscribe(this::onEvent);
public void onEvent(Event event) {
switch(event.getEventType()) {
case EventType.EVENT_0:
//Update UI
break;
case EventType.EVENT_1:
//Push event to server
break;
case EventType.EVENT_2:
//Update UI
break;
case EventType.EVENT_3:
//Push event to server
break;
}
.......
public class EventModel {
private static EventModel instance;
public static EventModel getInstance() {
if (instance == null) {
synchronized (EventModel.class) {
if (instance == null) {
instance = new EventModel();
}
}
}
return instance;
}
private PublishSubject<Event> events = PublishSubject.create();
public void sendEvent(Event o) {
events.onNext(o);
}
public Observable<Event> getEvents() {
return events;
}
public abstract class Event {
private Data data;
public Event(Data data) {
this.data = data;
}
public Data getData() {
return data;
}
}
public class Event0 extends Event {
public Event0(Data data) {
super(data);
}
}
public class Event1 extends Event {
public Event1(Data data) {
super(data);
}
}
public class Event2 extends Event {
public Event2(Data data) {
super(data);
}
}
public class Event3 extends Event {
public Event3(Data data) {
super(data);
}
}
}
...
eventModel.sendEvent(new Event0(new Data(...));
...
eventModel
.getEvents()
.subscribe(this::onEvent);
public void onEvent(Event event) {
if(event instanceof Event0)
//Update UI
else if(event instanceof Event1)
//Push event to server
else if(event instanceof Event2)
//Update UI
else if(event instanceof Event3)
//Push event to server
}
.......
Я не фанат ни одного решения, и они в основном одно и то же.Я думаю, что это можно сделать лучше, и я хотел бы получить некоторую поддержку.Заранее спасибо.