CountDownTimer: в Activity, ViewModel или в отдельном классе? - PullRequest
2 голосов
/ 24 июня 2019

Я хотел бы создать CountdownTimer, который будет запускать события, которые будут обновлять пользовательский интерфейс (запускать всплывающее окно, запускать анимацию и т. Д.).

Интересно, как это сделать, вот моиГипотеза и почему:

  1. Отдельный компонент EventCountdownTimer.Тогда я мог бы извлечь выгоду из использования LifecycleObserver, но мне интересно, как передать информацию обратно в упражнение (я попытался расширить CountdownTimer и использовать его в упражнении, но у меня есть ошибка, и я не могу ее скомпилировать)
  2. В самом Activity это самое простое, но я не уверен, что оно там, так как оно не является компонентом пользовательского интерфейса, и я не могу воспользоваться LifecycleObserver
  3. ВViewModel.Я подумал, что поскольку это связано с деятельностью, а CountdownTimer - это своего рода логические данные, они должны быть включены сюда, но это также означает наблюдение за жизненным циклом действия, и удержание любого поля, связанного с Activity внутри ViewModel, является плохой практикой.

Какой вариант на ваш взгляд самый лучший?И почему?

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Отдельный компонент "EventCountdownTimer"

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

public interface TimerListener {
    void onTimerResponse(String response);
}

Измените ваш EventCountdownTimer, чтобы иметь конструктор, который принимает TimerListener в качестве параметра, и переопределите метод onTimerResponse в вашей деятельности.Теперь из вашего EventCountdownTimer, например, когда вы пытаетесь связаться со своей деятельностью вместе с сообщением, вы можете просто вызвать функцию onTimerResponse(msgToDeliver).

Следовательно, ваш EventCountdownTimer должен выглядеть примерно так.

public class EventCountdownTimer {
    public static Context context;
    public static TimerListener listener;

    public EventCountdownTimer(Context context, TimerListener listener) {
        this.context = context;
        this.listener = listener;
    }

    public startCountdown() {
        // Start the count down here
        // ... Other code

        // When its time to post some update to your activity
        listener.onTimerResponse(msgToDeliver);
    }
}

И из вашей деятельности инициализируйте EventCountdownTimer, как показано ниже.

EventCountdownTimer timer = new EventCountdownTimer(this, new TimerListener() {
    @Override
    public void onTimerResponse(String message) {
        // Do something with the message data 
        // Update your UI maybe
    }
});

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

1 голос
/ 24 июня 2019

В шаблоне MVVM вы можете иметь LiveData, наблюдаемый в вашей ViewModel, который будет наблюдаться пользовательским интерфейсом, и при изменении значения вы соответствующим образом обновляете пользовательский интерфейс. То, как это наблюдаемое меняет значение, то есть ваша бизнес-логика, и все это должно быть в вашей ViewModel или в отдельных компонентах, которые будут использоваться ViewModel для обновления наблюдаемого состояния.

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

...