在我的ViewModel中我有这样一段代码:
...
private val billingClientLifecycle: BillingClientLifecycle
private val _isBillingConnectionReady = MutableLiveData<Boolean>()
val isBillingConnectionReady: LiveData<Boolean> = _isBillingConnectionReady
...
init {
...
billingClientLifecycle.setPurchaseUpdateListener(
object : IapPurchasesUpdatedListener {
...
override fun isBillingConnected(state: Boolean) {
Log.i(TAG, "Billing connection state is: $state")
_isBillingConnectionReady.value = state
}
}
)
billingClientLifecycle.createBillingConnection(getApplication())
...
}
...
这里我有一个billingClientLifecycle
对象,在init()
中调用createBillingConnection
方法,看到回调isBillingConnected
中有响应,看到_isBillingConnectionReady
livedata被调用,但是,在我订阅此事件的片段中没有此事件。
我在这里遗漏了什么?为什么实时数据没有传递事件?是否因为回调捕获了值?
1条答案
按热度按时间yxyvkwin1#
实际上我找到了一个解决方案,问题就在这里,老实说我完全忘记了这些方法的差异。
Link to the orig SO post:
根据文档:
设置值():
设定值。如果有作用中的观察者,则会将值传送给它们。这个方法必须从主执行绪呼叫。
postValue()函数:
向主线程发布任务以设置给定值。如果在主线程执行发布的任务之前多次调用此方法,则只调度最后一个值。
总而言之,关键区别在于:
setValue()
方法必须从主线程调用。但如果需要从后台线程设置值,则应使用postValue()
。