0

J'essaie une implémentation de base de données Live Component Architecture avec Kotlin comme ceci:Observer Android LiveData pas actif après la première mise à jour

class MarketFragment : LifecycleFragment(){ 
...... 
override fun onActivityCreated(savedInstanceState: Bundle?) { 
     super.onActivityCreated(savedInstanceState) 
     viewModel=ViewModelProviders.of(this).get(MarketViewModel::class.java) 
     viewModel.book?.observe(this, Observer { book-> //updateUI }) 
.... 

Ma classe ViewModel est créée comme ceci:

class MarketViewModel : ViewModel() 
{ 
    var book: MutableLiveData<Book>? =MutableLiveData() 
    var repository: Repository?= Repository() 

    init { 
     update("parameter") 
    } 

    fun update(s: String) 
    { 
     book=repository?.getBook(s) 

    } 

} 

Et mon dépôt:

fun getBook(bookSymbol:String):MutableLiveData<Book> 
{ 
    val book=MutableLiveData<Book>() 
    ...... 

      call . enqueue (object : Callback<Book> { 
     override fun onResponse(call: Call<Book>?, response: Response<Book>?) { 

      book.value=response?.body() 

     } 
    ..... 
    }) 
      return book 
} 

}

Et tout cela fonctionne très bien et l'interface utilisateur est mise à jour comme il se doit, mais seulement pour la première fois. Si je tente de faire des appels manuels pour mettre à jour le viewmodel d'une action de l'interface utilisateur, l'appel de modernisation fonctionne toujours comme prévu, mais les nouvelles données ne sont pas envoyées à l'observateur dans le Fragment:

//this doesn't work: 
viewModel.update("string") 
//This returns false: 
viewModel.book.hasActiveObservers() 

Est-ce le comportement attendu pour un observateur à devenir inactif après le premier déclencheur?

Répondre

3

Vous créez une nouvelle instance MutableLiveData chaque fois que vous appelez getBooks

Ainsi votre observateur ne respecte pas le droit LiveData plus.

Pour résoudre ce problème, votre ViewModel ne doit conserver qu'une seule instance de MutableLiveData et publier des mises à jour à l'aide de la fonction postValue.

Le référentiel, peut utiliser RxJava (Flowable) pour exécuter la requête sur un thread d'arrière-plan et retourner un Observable<Book> (ou Single<Book>)

+0

j'ai un même type question pouvez-vous s'il vous plaît regarder dans mon code ... première fois son déclenché .... mais après onChanged n'est pas appelé jusqu'à ce que je change la configuration .. –

+0

voici le lien @Vincent Minmoun-Prat https://stackoverflow.com/questions/48341561/will-the-changed-method-trigger -juste-comme-nous-changeons-les-données-même-si-nous-faisons/48342600? noredirect = 1 # comment83670748_48342600 –