Как я узнаю, что изменилось в моем классе Observable? - PullRequest
2 голосов
/ 05 марта 2020

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

У меня есть класс Singleton, который расширяет Observable. Внутри этого класса у меня есть две CountDownTimer переменные типа. Каждый из них содержит два метода: onTick() и onFinished().

Давайте назовем эти таймеры A и B для простоты.

Каждый раз, когда звонят A.onTick(), A.onFinished(), B.onTick(), B.onFinished(), я должен позвонить notifyObservers(), чтобы уведомить мой Observer, что что-то изменилось.

Пока все работает нормально , Проблема в том, что я знаю, что что-то изменилось, но я не знаю, что именно изменилось. В зависимости от того, кто уведомил меня, я должен выполнить некоторый код на стороне Observer.

Как узнать, какой из этих методов уведомил меня?

Ответы [ 2 ]

2 голосов
/ 05 марта 2020

Используйте LiveData вместо Observable. LiveData весьма полезен, потому что он не только поддается наблюдению, но и привязывается к жизненному циклу вашей деятельности, поэтому вам не нужно беспокоиться о том, как справиться с этим самостоятельно.

Может быть, этот пример поможет вам:

public class MyTimerWrapper {

    public static MyTimerWrapper getInstance() {
        // Your singleton logic

        createTimers();

        return instance;
    }

    private CountDownTimer timerA;
    private CountDownTimer timerB;

    private MutableLiveData<TimerEvent> timerALiveData = new MutableLiveData<TimerEvent>();
    private MutableLiveData<TimerEvent> timerBLiveData = new MutableLiveData<TimerEvent>();

    public LiveData<TimerEvent> startTimerA() {
        timerA.start();
        return timerALiveData;
    }

    public LiveData<TimerEvent> startTimerB() {
        timerB.start();
        return timerBLiveData;
    }

    private void createTimers() {
        createTimerA();
        createTimerB();
    }

    private void createTimerA() {
        timerA = new CountDownTimer(30000, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                // If you're running on another thread
                timerALiveData.postValue(TimerEvent.TICK);

                // Otherwise
                timerALiveData.setValue(TimerEvent.TICK);
            }

            @Override
            public void onFinish() {
                // If you're running on another thread
                timerALiveData.postValue(TimerEvent.FINISH);

                // Otherwise
                timerALiveData.setValue(TimerEvent.FINISH);
            }
        }
    }

    private void createTimerB() {
        // Same as createTimerA, but with timerB
    }
}

public enum TimerEvent {
    TICK,
    FINISH
}

Теперь, чтобы увидеть эти данные в вашей активности:

MyTimerWrapper timerWrapper = MyTimerWrapper.getInstance();
timerWrapper.startTimerA().observe(this, new Observer {
    @Override
    public void onChanged(TimerEvent timerEvent) {
        // Here you'll be able to see whether timerA is ticking or finished
    }
})
2 голосов
/ 05 марта 2020

Вы можете создать собственный класс EventType и передать его Observable.notifyObservers(Object arg):

public class EventType {

    String eventType; //"onTick" or "onFinish"
    TimerType timerType;

    EventType(String eventType, TimerType timerType){

        this.eventType = eventType;
        this.timerType = timerType;
    }
} 

TimerType - это тип перечисления:

public enum TimerType {
    A,
    B;        
}

и создать TimerA и TimerB классы, расширяющие CountDownTimer:

private class TimerA extends CountDownTimer {

    final EventType onTickEvent = new EventType("onTick", TimerType.A);
    final EventType onFinishEvent = new EventType("onFinish", TimerType.A);

    @Override
    public void onTick(long millisUntilFinished) {
        notifyObservers(onTickEvent);
    }

    @Override
    public void onFinish() {
        notifyObservers(onFinishEvent)
    }
}

Observer получит экземпляр EventType через его update(Observable o, Object arg); в аргументе arg

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...