Обработка состояний загрузки нескольких потоков в Activity - PullRequest
0 голосов
/ 02 октября 2018

В моем приложении для 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 также приветствуются)

1 Ответ

0 голосов
/ 02 октября 2018

У меня есть простая идея

в модели представления использовать переменную, подобную этой

var numberOFThreads = 0

и заменить эту строку

loadingState.postValue(Status.LOADING)

на

if(numberOFThreads == 0){
loadingState.postValue(Status.LOADING)
}else{
numberOFThreads++
}

and
if(numberOFThreads == 0){
loadingState.postValue(Status.IDLE )
}else{
numberOFThreads--
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...