片段 livedata 观察器仅调用一次,默认值

Fragment livedata observer called only once with default value

提问人:MXC 提问时间:6/26/2019 更新时间:6/26/2019 访问量:1202

问:

我只是无法弄清楚这段代码中出了什么问题,以及为什么在更新值时没有调用观察者。我正在将 Fragement 与 livedata 一起使用,这是完整的代码。当应用程序启动时,片段从默认数据中获取它的值,在本例中为 100。但是,在使用 method 更新值后,不会调用观察者。我放了一个打印语句,我可以看到方法在主线程中执行。请帮忙queueChannelId(channelId)

片段:

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    viewModel = 
ViewModelProviders.of(this).get(SomeViewModel::class.java)

    viewModel.getChannelId().observe(this, Observer {
        // Only called with default value of mutablelivedata

    })
}

我可以保证 onDestroyView 和 onDestroy 在任何时候都没有被调用。

视图模型:

fun getChannelId() : MutableLiveData<Int> {
    return repository.getChannelId()
    }

存储 库:

var channelIdObservable = MutableLiveData(100)

fun queueChannelId(channelId: Int) {
    channelIdObservable.value = channelId
}
fun getChannelId() : MutableLiveData<Int> = channelIdObservable
Android 视图模型 android-architecture-components android-livedata

评论

0赞 DHAVAL A. 6/26/2019
修复此行:与此行:var channelIdObservable = MutableLiveData(100)var channelIdObservable = MutableLiveData<Int>()
0赞 Anmol 6/26/2019
@DHAVALASODARIYA这不可能是问题。
0赞 Anmol 6/26/2019
如果您从其他线程调用,请尝试无论如何,请尝试此操作。我在这里看不到任何其他问题。queueChannelIdchannelIdObservable.postValue (channelId)
0赞 Sanlok Lee 6/26/2019
我的盲目猜测是,您要么重新分配,要么调用不同的存储库实例。channelIdObservablequeueChannelId
0赞 MXC 6/26/2019
@SanlokLee 你说得对,经过一番调试,我发现仓库实例是不同的。我以为我的实例是单例的,但显然它是为每个视图模型创建的。所以我想这就是错误。感谢您的帮助。

答:

0赞 Anmol 6/26/2019 #1

如果您从其他线程调用,请尝试queueChannelId

channelIdObservable.postValue (channelId)

PS:我在这里看不到任何其他问题。分享你如何调用的代码。queueChannelId

评论

0赞 MXC 6/26/2019
谢谢 Anmol,我发现了问题并更新了上面的评论部分。问题是我有不同的存储库对象实例。我想我将不得不使 repo 对象单例。