【问题标题】:Android LiveData Observer not active after first updateAndroid LiveData Observer 首次更新后未激活
【发布时间】:2017-08-18 14:26:45
【问题描述】:

我正在尝试使用 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,改造调用仍按预期工作,但新数据不会发送到 Fragment 中的观察者:

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

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

【问题讨论】:

    标签: android kotlin android-architecture-components android-livedata


    【解决方案1】:

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

    因此您的观察者不再观察正确的LiveData

    解决这个问题

    1. 您的 ViewModel 应该只保留一个(不可变的)LiveData 实例
    2. 那个不可变的 LiveData 实例可能是:

      • MediatorLiveData,其来源是存储库的 LiveData
      • 存储库 LiveData 的转换

    这意味着存储库方法 getBooks 仅在 ViewModel 初始化时调用一次,并且要么刷新自身,要么您必须调用存储库上的另一个方法来触发刷新。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多