android 为什么LiveData在从回调调用时不传递事件?

afdcj2ne  于 2022-11-03  发布在  Android
关注(0)|答案(1)|浏览(177)

在我的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被调用,但是,在我订阅此事件的片段中没有此事件。
我在这里遗漏了什么?为什么实时数据没有传递事件?是否因为回调捕获了值?

yxyvkwin

yxyvkwin1#

实际上我找到了一个解决方案,问题就在这里,老实说我完全忘记了这些方法的差异。
Link to the orig SO post
根据文档:
设置值():
设定值。如果有作用中的观察者,则会将值传送给它们。这个方法必须从主执行绪呼叫。
postValue()函数:
向主线程发布任务以设置给定值。如果在主线程执行发布的任务之前多次调用此方法,则只调度最后一个值。
总而言之,关键区别在于:
setValue()方法必须从主线程调用。但如果需要从后台线程设置值,则应使用postValue()

相关问题