【问题标题】:LiveData change with callback functionLiveData 随回调函数变化
【发布时间】:2019-03-01 14:07:29
【问题描述】:

所以我在存储库中有这个功能:

fun getFeaturedLive() : MutableLiveData<Resource<Prod>> {

    val res = MutableLiveData<Resource<Prod>>()
    res.value = Resource.loading(null) //status = loading, data = null, message - null


    client.request({
        it.getOnlineProduct(param1, param2, param3)
    },{//executes on success return from server
        res.value!!.status = Status.SUCCESS
        res.value!!.data = it
    },{//executes on error return from server
        res.value!!.status = Status.ERROR
        res.value!!.message = it.message
        true //error handled
    })

    return res
}

res 被返回,然后,当来自服务器的响应到来时,on success 函数被执行,修改数据和状态。

现在在我的 onViewCreated 方法中,我有这样的东西:

viewmodel.prodLive.observe(this, Observer {
        if (it.status == Status.ERROR) errAlert(it.message)
        if( it.status == Status.SUCCESS) initList(prodList, it.data)
        if (it.status == Status.LOADING) log("loading ...")
    })

服务器返回该产品,调用 onsuccess 函数并修改 livedata,但观察者看不到它。我应该如何修改代码,以便观察者对数据更改做出反应?我是 LiveData 的新手,所以如果您有任何其他建议,我很高兴听到。

这是在我的视图模型中

var prodLive = MutableLiveData<Resource<Prod>>()
        private set
fun init(){
    prodLive = Rep.getFeaturedLive()
}

【问题讨论】:

  • viewmodel.prodLivegetFeaturedLive() 的对象吗?
  • 是的,这就是'var prodLive = MutableLiveData>() 私有集'
  • 你正在观察和改变不同对象的价值
  • 我将他分配给存储库函数返回值。他们现在不应该是一样的吗?

标签: android asynchronous kotlin reactive-programming android-livedata


【解决方案1】:

LiveData 无法检测到它所包含的值的内部是否发生了变化,只有当你给它一个全新的值时。

这是你目前正在做的事情:

res.value = Resource.loading(null) // triggers an update, new value set
res.value.status = Status.SUCCESS  // changes existing value, no update

这就是你需要做的,而不是触发LiveData观察者:

res.value = Resource.loading(null) // triggers an update, new value set
res.value = Resource.done(Status.SUCCESS, data) // triggers an update, new value set again

我当然是在猜测最后一行的语法,但我希望你能明白。

【讨论】:

    【解决方案2】:

    问题在于此处的 livedata 的实现。您没有发布 liveData 值,只是设置数据。

    查看此链接:https://developer.android.com/reference/android/arch/lifecycle/LiveData#postvalue

    • 由于您的 api 是异步的,因此您在 api 的结果之前返回 livedata 值。
    • api 完成后,您正在设置值,但不会发布 livedata 结果。
    • 设置数据后必须调用livedata.postValue("data")方法。

    这是我设法更新 UI 状态的方法。不熟悉Kotlin所以用java写。

    private MutableLiveData<Resource<Prod>> mProductsLiveData = new MutableLiveData<>();
    
        public MutableLiveData<Resource<Prod>> getProductsLive() {
            return mProductsLiveData;
            }
    
        public void callAPI() {
    
            // Set Resource value to loading before calling api
            mProductsLiveData.postValue(Resource.loading(null)); 
    
            mRepository.getProductsFromServer(productsRequest)
            .subscribe(this::apiSuccess, this::apiError); 
            }
    
        public void apiSuccess(Response response) {
            // Set Resource value to Success and set data
            mProductsLiveData.postValue(Resource.success(response.getData()));
            }
    
    
        public void apiFailure(Throwable error) {
            // Set Resource value to Error and set Message
            mProductsLiveData.postValue(Resource.error(error.getMessage()));
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      • 2019-08-27
      • 2021-10-25
      相关资源
      最近更新 更多