从协程获取字符串
Get string from cotoutine
我遇到了一个非常简单的问题,我正在尝试从 volley 请求中获取 sid,我已经能够实现协程,但我无法从 GlobalScope.launch() 函数,也许这不是执行它的好方法我不知道,这是我的代码我希望有人能帮忙谢谢。
GlobalScope.launch() {
data = getData()
println(data)
}
这是我的协程和我的 getData 函数
suspend fun getData() = suspendCoroutine<String> { cont ->
val queue = Volley.newRequestQueue(this)
val url = "http://www.google.com/"
val stringRequest = StringRequest(Request.Method.GET, url,
{ response ->
cont.resume("Response is: ${response.substring(0, 500)}")
},
{ cont.resume("Something went wrong!") })
queue.add(stringRequest)
}
interface VolleyStringResponse {
fun onSuccess(response: String?)
}
简单的回答是:你不能。
这就是等待结果的全部。等待某事有几种方法,最常见的是:线程阻塞、挂起(协程)、回调和 futures/premises。您已经通过回调将等待转换为挂起 - 这很好,因为挂起通常比回调更容易处理。
但是如果你这样想:
fun onClick() {
val data = getData()
doSomething(data)
}
那么这是不可能的,至少在不阻塞我们应该避免的线程的情况下是不可能的。这是因为 non-suspending 函数除了阻塞线程之外不能以任何其他方式等待。
通常,我们将整个操作封装在协程中,并在其中按顺序执行操作,例如:
fun onClick() = lifecycleScope.launch {
val data = getData()
doSomething(data)
}
因此,我们没有将数据提取到 launch()
之外,而是将后续步骤也移到了 launch()
。
另外,我们应该避免使用GlobalScope
。在 Android 上,您 could/should 通常使用 lifecycleScope
或 viewModelScope
。
我遇到了一个非常简单的问题,我正在尝试从 volley 请求中获取 sid,我已经能够实现协程,但我无法从 GlobalScope.launch() 函数,也许这不是执行它的好方法我不知道,这是我的代码我希望有人能帮忙谢谢。
GlobalScope.launch() {
data = getData()
println(data)
}
这是我的协程和我的 getData 函数
suspend fun getData() = suspendCoroutine<String> { cont ->
val queue = Volley.newRequestQueue(this)
val url = "http://www.google.com/"
val stringRequest = StringRequest(Request.Method.GET, url,
{ response ->
cont.resume("Response is: ${response.substring(0, 500)}")
},
{ cont.resume("Something went wrong!") })
queue.add(stringRequest)
}
interface VolleyStringResponse {
fun onSuccess(response: String?)
}
简单的回答是:你不能。
这就是等待结果的全部。等待某事有几种方法,最常见的是:线程阻塞、挂起(协程)、回调和 futures/premises。您已经通过回调将等待转换为挂起 - 这很好,因为挂起通常比回调更容易处理。
但是如果你这样想:
fun onClick() {
val data = getData()
doSomething(data)
}
那么这是不可能的,至少在不阻塞我们应该避免的线程的情况下是不可能的。这是因为 non-suspending 函数除了阻塞线程之外不能以任何其他方式等待。
通常,我们将整个操作封装在协程中,并在其中按顺序执行操作,例如:
fun onClick() = lifecycleScope.launch {
val data = getData()
doSomething(data)
}
因此,我们没有将数据提取到 launch()
之外,而是将后续步骤也移到了 launch()
。
另外,我们应该避免使用GlobalScope
。在 Android 上,您 could/should 通常使用 lifecycleScope
或 viewModelScope
。