В моем приложении для Android я бы хотел, чтобы пользователь мог видеть, когда задача выполняется в фоновом режиме.
Этими задачами могут быть сетевые вызовы или операции с базой данных, выполняемые в отдельных фоновых потоках.
В Activity
есть один неопределенный ProgressBar
, который я хотел бы показать, если выполняются какие-либо фоновые задачи, и скрыть его в противном случае.
Я искал решенияк этому, и люди, кажется, используют LiveData
для аналогичных целей.
Так что я решил, что создам LiveData
в ViewModel
из Activity
, который представляет текущее состояние загрузки приложения, что-то вроде этого:
val loadingState = MutableLiveData<State>()
Всякий раз, когда я начинаю или заканчиваю задачу, я отправляю соответствующее значение этому LiveData
:
// starting background operation
loadingState.postValue(Status.LOADING)
И я бынаблюдать за ним из Activity
и показывать / скрывать ProgressBar
в соответствии с текущим состоянием:
loadingState.observe(this, Observer { status ->
when (status) {
Status.LOADING -> showProgressBar()
Status.IDLE -> hideProgressBar()
}
}
Моя проблема в том, что я не знаю, как справиться с этим, когда запущено несколько задачнесколько потоков.
Например:
- Задача запускается и устанавливает статус
LOADING
(правильный) - B запускается задача (статус уже
LOADING
, поэтому ничегопроисходит) (правильно) A задача завершается и устанавливает статус IDLE
, однако B все еще выполняется (неправильно)
ProgressBar
будет скрыт, даже если B все еще выполняется
- B задача завершена, но статус уже
IDLE
(неправильно)
Я думал, что смогу сохранить Collection
из LiveData
объектов (как в отдельном LiveData
для каждой задачи), но это кажется действительно громоздким.
есть идиоматический способ справиться с этим?
(ответы на Java также приветствуются)