如何与mvvm同步?

时间:2019-12-27 10:41:07

标签: android android-mvvm

我正在研究mvvm。当我调用init()时,第一个调用为null。 使用改造,我认为原因是函数getIndexRetrofit()在行执行data.value = res之前返回。因此,我想对此进行同步,希望函数返回的不是空值而是响应值。

存储库:

fun getIndexRetrofit(name:String) : MutableLiveData<UserModel>{   

    Retrofit2Service.getService().requestUserInfo(name).enqueue(object: Callback<UserModel> {
        override fun onFailure(call: Call<UserModel>, t: Throwable) {
           data.postValue(null)
        }
        override fun onResponse(call: Call<UserModel>, response: Response<UserModel>) {
            if(response.body()!=null) {
                var res = response.body()!!

                data.value = res
            }
        }
    })//Retrofit

    return data
}

1 个答案:

答案 0 :(得分:0)

我不能说getIndexRetrofit()应该做什么,但是我相信您在这里滥用实时数据。您正在进行异步调用Retrofit2Service.getService().requestUserInfo(name).enqueue,它将被调用,将发出请求,但尚未收到执行结果,同时将发生return data

了解onFailure()onResponse()是回调,并且不会立即执行代码。您的代码无意从头到尾顺序阅读。下一个执行顺序

  1. Retrofit2Service.getService().requestUserInfo(name).enqueue
  2. return data
  3. onResponse()onFailure()

您不应在getIndexRetrofit()中返回任何内容,而应将函数重构为类似的样子

fun getIndexRetrofit(name:String) {   
    Retrofit2Service.getService().requestUserInfo(name).enqueue(object: Callback<UserModel> {
        override fun onFailure(call: Call<UserModel>, t: Throwable) {
           data.postValue(null)
        }
        override fun onResponse(call: Call<UserModel>, response: Response<UserModel>) {
            if(response.body()!=null) {
                var res = response.body()!!
                data.value = res
            }
        }
    })
}