Интересная идея для проекта! Если планируете работать над ним дальше, то вот вам несколько проблем, которые я заметил при прочтении:
1) Тост ошибки — это событие, а не состояние.
Попробуйте запустить проект с нуля без разрешения на впн, вызвать ошибку и потом переворачивать экран туда-сюда. Тост будет показываться снова и снова и снова.
Это происходит потому, что лайвдата отсылает своё последнее значение каждому новому наблюдателю, т.к. уничтожаются/регаются новые после поворота экрана.
2) При вызове suspend функций из api для ретрофита не нужно использовать Dispatchers.IO, у ретрофита свои диспатчеры, отвечающие за сетевые запросы
3) Вместо AtomicBoolean флага isRunning я бы рекомендовал посмотреть на свойство isActive у корутины, что, по идее, вам и нужно
4) Будьте аккуратны с использованием try/catch в контексте корутин, т.к. можно случайно поймать исключение, которое позволяет им отменяться (CancellationException). У вас они вручную не отменяются, но на всякий случай упомяну. Чтобы избежать такой проблемы, можно вызывать в корутине coroutineContext.ensureActive(), или просто пробрасывать дальше пойманное исключение, если это CancellationException.
В общем, это базовые проблемы, которые не особо касаются впн, но на которые стоит обратить внимание при разработке.
Интересная идея для проекта! Если планируете работать над ним дальше, то вот вам несколько проблем, которые я заметил при прочтении:
1) Тост ошибки — это событие, а не состояние.
Попробуйте запустить проект с нуля без разрешения на впн, вызвать ошибку и потом переворачивать экран туда-сюда. Тост будет показываться снова и снова и снова.
Это происходит потому, что лайвдата отсылает своё последнее значение каждому новому наблюдателю, т.к. уничтожаются/регаются новые после поворота экрана.
2) При вызове suspend функций из api для ретрофита не нужно использовать Dispatchers.IO, у ретрофита свои диспатчеры, отвечающие за сетевые запросы
3) Вместо AtomicBoolean флага isRunning я бы рекомендовал посмотреть на свойство isActive у корутины, что, по идее, вам и нужно
4) Будьте аккуратны с использованием try/catch в контексте корутин, т.к. можно случайно поймать исключение, которое позволяет им отменяться (CancellationException). У вас они вручную не отменяются, но на всякий случай упомяну. Чтобы избежать такой проблемы, можно вызывать в корутине coroutineContext.ensureActive(), или просто пробрасывать дальше пойманное исключение, если это CancellationException.
В общем, это базовые проблемы, которые не особо касаются впн, но на которые стоит обратить внимание при разработке.