提问者:小点点

在静态编程语言中对onResponse()进行排队


函数在异步onResponse()中设置data. value之前返回null。如何使其首先获取数据,然后返回该数据?

fun getNews(code: String): LiveData<List<News>>{

    val call = service.getNewsByCountry(code, Constant.API_KEY)

    var data = MutableLiveData<List<News>>()

    call.enqueue(object : Callback<NewsResponse> {
        override fun onFailure(call: Call<NewsResponse>?, t: Throwable?) {
            Log.v("retrofit", "call failed")
        }

        override fun onResponse(call: Call<NewsResponse>?, response: Response<NewsResponse>?) {
            data.value = response!!.body()!!.articles
        }

    })

    return data
}

共3个答案

匿名用户

您正在进行异步调用,因此在该异步调用解析之前不会设置data. value。但是,由于您正在生成MutableLiveData,因此您应该能够观察到,这将在您的异步调用设置值时为您提供更新。

匿名用户

只需使用对象:回调

 accessTocken.enqueue(object : Callback<AccessToken> {
            override fun onFailure(call: Call<AccessToken>, t: Throwable) {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }

            override fun onResponse(call: Call<AccessToken>, response: Response<AccessToken>) {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }

        })

匿名用户

试试看

fun getNews(code: String): LiveData<List<News>>{

    val call = service.getNewsByCountry(code, Constant.API_KEY)
    var data = MutableLiveData<List<News>>()
    doAsync {
        call.enqueue(object : Callback<NewsResponse> {
            override fun onFailure(call: Call<NewsResponse>?, t: Throwable?) {
                Log.v("retrofit", "call failed")
            }

            override fun onResponse(call: Call<NewsResponse>?, response: Response<NewsResponse>?) {
                data.value = response!!.body()!!.articles
            }

        })
    }

    return data
}

如果不存在doAsync尝试在您的app/build. gralde上添加关注anko依赖项

implementation "org.jetbrains.anko:anko-design:0.10.5"