В этом репозитории находится задание по теме Coroutines. Каждое из заданий выполняется в отдельном фрагменте главного экрана.
Задание нужно сдавать в виде нескольких атомарных коммитов по каждой задаче. Например:
- Задание 1.1 - Таймер с использованием coroutines
- Задание 1.2 - Перевод таймера на Kotlin Flow
- Задание 2.1 - Login с использованием coroutines
- Задание 2.2 - Login с использованием Kotlin Flow
- Задание 3 - Speed-test
В этом задании вам нужно сделать таймер при помощи coroutines.
В коде TimerFragment.kt есть функции startTimer и stopTimer для
запуска и останова таймера.
Напишите код корутины, которая будет увеличивать счетчик раз в несколько миллисекунд (по вашему выбору) и обновлять значение переменной time.
Используйте scope, привязанный ко view фрагмента.
В этом задании вам нужно переписать пример с использованием Kotlin Flow.
- Измените переменную
timeнаtimeFlowтипаMutableStateFlow<Duration>. - Создавайте
timeFlowвonViewCreatedс учетом изначального значения вbundle. - Подпишитесь на
timeFlowвonViewCreatedи обновляйте значение текстового поляtime. - Используйте
repeatOnLifecycleдля отслеживания таймера. - В корутине таймера используйте
emitдля обновления значенияtimeFlow.
В этом задании вам нужно сделать форму логина при помощи coroutines.
Состояние LoginFragment.kt определяется в LoginViewModel.kt
при помощи свойства state и может принимать одно из следующих значений LoginViewState:
LoginViewState.Login- форма входа. Опционально содержит ошибку входаLoginViewState.LoggingIn- процесс входаLoginViewState.Content- контент после входаLoginViewState.LoggingOut- процесс выхода
Реализуйте функции login и logout в коде LoginViewModel.kt.
Требования:
- Используйте экземпляр LoginApi для запуска операций входа и выхода.
- Обратите внимание, что если запустить сетевую операцию на основном потоке, то приложение выдаст ошибку.
- Используйте scope, привязанный к viewModel.
- При входе и выходе показывайте индикатор загрузки, переключая состояние на
LoggingInиLoggingOutсоответственно. - При успешном входе переключайте состояние на
Content. - При ошибке входа переключайте состояние на
Loginи передавайте ошибку в состоянии.
В этом задании вам нужно переписать пример с использованием Kotlin Flow.
- Измените тип свойства
stateнаStateFlow. - Создайте внутреннее поле
stateFlowтипаMutableStateFlow<LoginViewState>и экспортируйте его какstate. - Напишите внутреннюю функцию
loginFlow, которая будет запускать сетевую операцию и возвращатьFlow<LoginViewState>. - Используйте билдер
flowдля создания холодного потока изменения состояния. - По мере выполнения операции, посылайте новое состояние при помощи функции
emit. - Подпишитесь на
loginFlowв функцииloginи обновляйте значениеstateFlowвнутриcollect.
В этом задании вам нужно сделать эмулятор speed-test при помощи coroutines.
Мы будем тренироваться запускать несколько корутин одновременно и усреднять их время выполнения.
В коде NetworkViewModel.kt определена функция emulateBlockingNetworkRequest,
которая эмулирует сетевой запрос. Функция возвращает время выполнения запроса в миллисекундах или ошибку.
Вам нужно реализовать метод модели startTest, который запускает несколько запросов одновременно и усредняет время выполнения.
- Используйте scope, привязанный к viewModel.
- Запускайте несколько параллельных корутин.
- Отфильтруйте удачные результаты.
- Усредните время выполнения запросов.
- Результат поместите в переменную
_result. - На время выполнения операции, показывайте индикатор загрузки, устанавливая значение
_runningвtrue.


