首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >方法在执行Retrofit回调之前返回一个空值。

方法在执行Retrofit回调之前返回一个空值。
EN

Stack Overflow用户
提问于 2020-04-01 08:02:06
回答 2查看 148关注 0票数 1

在Android开发中使用MVVM模式时,我们创建一个存储库类,在其中执行所有网络请求。问题在于,由于retrofit的.enqueue()方法是异步的,所以调用.enqueue的方法不会等到获得回调(这是非常符合逻辑的)并返回null。解决这个问题的一种方法是将MutableLiveData对象传递给我的存储库方法,并在回调中设置它的值,但是我不想在我的视图(片段)中观察我的所有ViewModel属性。解决这个问题的共同方法是什么?

代码语言:javascript
运行
复制
fun createRoute(newRoute: RouteToSend): String {
        var responseMessage: String? = null
        webService.createRoute(authToken!!, newRoute).enqueue(object: Callback<Message> {
            override fun onFailure(call: Call<Message>, t: Throwable) {
                Log.e(TAG, t.message!!)
            }

            override fun onResponse(call: Call<Message>, response: Response<Message>) {
                response.body()?.let { responseMessage = it.message }
            }
        })
        return responseMessage!!
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-01 08:10:18

是的,使用MutableLiveData是一种方式,另一方面,使用回调机制是另一种更合适的方式。如果要使用回调,可以更改方法如下

代码语言:javascript
运行
复制
fun createRoute(newRoute: RouteToSend, callback : (String?) -> Unit): String {
        var responseMessage: String? = null
        webService.createRoute(authToken!!, newRoute).enqueue(object: Callback<Message> {
            override fun onFailure(call: Call<Message>, t: Throwable) {
                Log.e(TAG, t.message!!)
callback(responseMessage)
            }

            override fun onResponse(call: Call<Message>, response: Response<Message>) {
                response.body()?.let { responseMessage = it.message 
callback(responseMessage)}
            }
        })

    }

然后您可以像这样调用您的createRoute方法

代码语言:javascript
运行
复制
createRoute(route_to_send_variable, 
    callback = {
        it?.let {
            // use the response of your createRoute function here
    }
})
票数 1
EN

Stack Overflow用户

发布于 2020-04-01 08:09:47

将回调作为参数传递。

代码语言:javascript
运行
复制
createRoute(newRoute: RouteToSend, callback: CreateRouteListener)

使用

代码语言:javascript
运行
复制
interface CreateRouteListener {
    fun onFailure()
    fun onResponse(response: String)
}

并在异步进程完成时调用相应的方法:

代码语言:javascript
运行
复制
override fun onFailure(call: Call<Message>, t: Throwable) {
    Log.e(TAG, t.message!!)
    callback.onFailure()
}

override fun onResponse(call: Call<Message>, response: Response<Message>) {
    response.body()?.let {
        responseMessage = it.message
        callback.onResponse(responseMessage)
    }
}

然后调用createRoute将如下所示:

代码语言:javascript
运行
复制
createRoute(RouteToSend(), object: CreateRouteListener {
    override fun onFailure() {
        // handle failure
    }
    override fun onResponse(response: String) {
        // handle response
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60966140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档