109 votes

MutableLiveData: impossible d'appeler setValue sur un thread d'arrière-plan depuis Coroutine

J'essaye de déclencher une mise à jour sur LiveData à partir d'une coroutine:

 object AddressList: MutableLiveData<List<Address>>()
fun getAddressesLiveData(): LiveData<List<Address>> {
    AddressList.value = listOf()
    GlobalScope.launch {
        AddressList.value = getAddressList()
    }
    return AddressList
}

mais j'obtiens l'erreur suivante:

IllegalStateException: impossible d'appeler setValue sur un thread d'arrière-plan

Existe-t-il un moyen de le faire fonctionner avec les coroutines?

231voto

Amir Hossein Ghasemi Points 1112

Utilisez liveData.postValue(value) au lieu de liveData.value = value . Cela s'appelle asynchrone.

De la documentation :

postValue - Publie une tâche sur un thread principal pour définir la valeur donnée.

18voto

pdegand59 Points 6690

Vous pouvez effectuer l'une des opérations suivantes:

 object AddressList: MutableLiveData<List<Address>>()
fun getAddressesLiveData(): LiveData<List<Address>> {
    AddressList.value = listOf()
    GlobalScope.launch {
        AddressList.postValue(getAddressList())
    }

return AddressList
}

ou alors

 fun getAddressesLiveData(): LiveData<List<Address>> {
    AddressList.value = listOf()
    GlobalScope.launch {
        val adresses = getAddressList()
        withContext(Dispatchers.Main) {
            AddressList.value = adresses
        }
    }
    return AddressList
}

5voto

kike Points 1157

Je viens de comprendre que c'est possible en utilisant withContext(Dispatchers.Main){} :

 object AddressList: MutableLiveData<List<Address>>()
fun getAddressesLiveData(): LiveData<List<Address>> {
    GlobalScope.launch {
        withContext(Dispatchers.Main){ AddressList.value = getAddressList() }
    }
    return AddressList
}

3voto

Amin Keshavarzian Points 143

Dans mon cas, j'ai dû ajouter Dispatchers.Main aux arguments de lancement et cela a bien fonctionné:

  val job = GlobalScope.launch(Dispatchers.Main) {
                    delay(1500)
                    search(query)
                }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X