0

最初の更新の後:アンドロイドLiveDataオブザーバーアクティブではありませんが、私はこのようにKotlinとアーキテクチャコンポーネントのライブデータの基本的な実装をしようとしている

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

私のViewModelクラスには、次のように作成されます。

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

    init { 
     update("parameter") 
    } 

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

    } 

} 

そして、私のリポジトリ:

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 
} 

}

これはすごくうまく動作し、UIは最初に更新されるだけです。私は、UIのアクションからのViewModelを更新するために、手動で電話をかけることがしようとした場合、改造コールはまだ期待通りに動作しますが、新しいデータが断片で観察者に送信されません。

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

はそれがために期待される動作ですオブザーバーが最初のトリガーの後に非アクティブになる

答えて

3

は新しいMutableLiveDataインスタンスごとに、あなたの観察者がもう右LiveDataを観察されていないしたがって

getBooksを呼び出しているを作成しています。

これを解決するには、ViewModelは1つのMutableLiveDataインスタンスのみを保持し、postValue関数を使用してそれに更新をポストする必要があります。

リポジトリは、バックグラウンドスレッドでクエリを実行し、私はあなたが私のコードに見てくださいすることができ、同じタイプの問題を持っているObservable<Book>(またはSingle<Book>

+0

...最初の時間を返すためにRxJava(フロアブル)を使用することができますそのトリガー....しかしその後、私は構成を変更するまで、onChanged isntが呼び出されます.. –

+0

ここにリンク@ Vincent Minmoun-Prat https://stackoverflow.com/questions/48341561/will-the-onchanged-method-trigger - 私たちが変わったとしてもデータを変えるのと同じように/ 48342600?noredirect = 1#comment83670748_48342600 –

関連する問題