Использование RxJava для замены обратного вызова несколькими функциями - PullRequest
0 голосов
/ 11 июня 2019

Я новичок в 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
}
.......

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

...