在Android开发中使用MVVM模式时,我们创建一个存储库类,在其中执行所有网络请求。问题在于,由于retrofit的.enqueue()方法是异步的,所以调用.enqueue的方法不会等到获得回调(这是非常符合逻辑的)并返回null。解决这个问题的一种方法是将MutableLiveData对象传递给我的存储库方法,并在回调中设置它的值,但是我不想在我的视图(片段)中观察我的所有ViewModel属性。解决这个问题的共同方法是什么?
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!!
}发布于 2020-04-01 08:10:18
是的,使用MutableLiveData是一种方式,另一方面,使用回调机制是另一种更合适的方式。如果要使用回调,可以更改方法如下
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方法
createRoute(route_to_send_variable,
callback = {
it?.let {
// use the response of your createRoute function here
}
})发布于 2020-04-01 08:09:47
将回调作为参数传递。
createRoute(newRoute: RouteToSend, callback: CreateRouteListener)使用
interface CreateRouteListener {
fun onFailure()
fun onResponse(response: String)
}并在异步进程完成时调用相应的方法:
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将如下所示:
createRoute(RouteToSend(), object: CreateRouteListener {
override fun onFailure() {
// handle failure
}
override fun onResponse(response: String) {
// handle response
}
}https://stackoverflow.com/questions/60966140
复制相似问题