0

我尝试架构组件的实时数据的基本实现与科特林这样后:的Android LiveData观察员不活跃的第一次更新

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操作更新视图模型,改造呼叫仍然工作正常,但新的数据不会被发送到片段中的观察报:

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

是它的预期的行为观察者在第一次触发后变为非活动状态?

回答

3

你正在创建每次您呼叫getBooks

因此你的观察是不遵守正确的LiveData了一个新的MutableLiveData实例。

为了解决这个问题,您的ViewModel应该只保留一个MutableLiveData实例并使用postValue函数发布更新。

然后储存库可以使用RxJava(液体)来执行在后台线程查询并返回一个Observable<Book>(或Single<Book>

+0

我有一个相同类型的问题可以请你看看我的代码......第一次其触发....但之后,onChanged不被调用,直到我改变配置.. –

+0

这里是链接@Vincent Minmoun-Prat https://stackoverflow.com/questions/48341561/will-the-onchanged-method-trigger - 只是-AS-WE-变化的数据偶数如果 - 我们 - 不要/ 48342600?noredirect = 1个#comment83670748_48342600 –