Android LiveData Observer在首次更新后无效

Rob*_*urt 3 android kotlin android-livedata android-architecture-components

我正在尝试使用Kotlin对Architecture Component的实时数据进行基本实现,如下所示:

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 })
....
Run Code Online (Sandbox Code Playgroud)

我的ViewModel类是这样创建的:

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

    init {
        update("parameter")
    }

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

    }

}
Run Code Online (Sandbox Code Playgroud)

和我的存储库:

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
}
Run Code Online (Sandbox Code Playgroud)

}

所有这些都很有效,UI应该更新,但只是第一次.如果我尝试进行手动调用以从UI操作更新viewModel,则改装调用仍然按预期工作,但新数据不会发送到片段中的Observer:

//this doesn't work:
viewModel.update("string")
//This returns false:
viewModel.book.hasActiveObservers()
Run Code Online (Sandbox Code Playgroud)

是第一次触发后Observer变为非活动状态的预期行为吗?

Vin*_*rat 9

您每次调用时都在创建一个新的MutableLiveData实例 getBooks

因此,你的观察者不再观察右翼LiveData了.

要解决此问题,ViewModel应该只保留一个MutableLiveData实例,并使用该postValue函数向其发布更新.

然后,存储库可以使用RxJava(Flowable)在后台线程上执行查询并返回Observable<Book>(或Single<Book>)