从协程获取字符串

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 通常使用 lifecycleScopeviewModelScope