0

ich eine grundlegende Implementierung der Architektur Komponenten der Live-Daten mit Kotlin ausprobieren wie folgt aus:Android Livedata Observer nicht aktiv nach dem ersten Update

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 }) 
.... 

Meine Viewmodel-Klasse wird wie folgt erstellt:

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

    init { 
     update("parameter") 
    } 

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

    } 

} 

And My Repository:

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 
} 

}

Und das alles funktioniert großartig und UI wird aktualisiert, wie es sollte, aber nur zum ersten Mal. Wenn ich versuche, manuell, Anrufe zu tätigen, das Ansichtsmodell von einer UI-Aktion zu aktualisieren, der Retrofit-Aufruf funktioniert immer noch wie erwartet, aber die neuen Daten nicht auf den Beobachter im Fragmente gesendet:

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

Ist es das erwartete Verhalten für ein Observer nach dem ersten Trigger inaktiv werden?

Antwort

3

Sie erstellen eine neue MutableLiveData Instanz jedes Mal, wenn Sie anrufen getBooks

Daher Ihr Beobachter LiveData das Recht nicht beobachtet mehr.

Um dieses Problem zu lösen, sollte Ihr ViewModel nur eine MutableLiveData-Instanz enthalten und Aktualisierungen mit der Funktion postValue an diese senden.

Das Repository kann dann RxJava (Flowable) verwenden, um die Abfrage auf einem Hintergrund-Thread ausgeführt werden und ein Observable<Book> (oder Single<Book>)

+0

i ein gleichen Typen Problem habe zurückgeben können Sie bitte meinen Code aussehen in ... erstes Mal seine ausgelöst .... aber danach onChanged wird nicht aufgerufen, bis ich die Konfiguration ändern .. –

+0

hier ist der Link @Vincent Minmoun-Prat https://StackOverflow.com/Questions/48341561/will-the-onchanged-method-trigger -just-as-we-ändern-the-data-even-wenn-wir-nicht/48342600? noredirect = 1 # comment83670748_48342600 –

Verwandte Themen