如何在 kotlin 协程中执行网络进程

How do I perform a network process in a kotlin coroutine

我正在尝试 运行 我的 android 应用程序中的 getByName 方法,但发现在主要 activity 中这样做是值得关注的。我知道我需要使用协程、异步或线程。但我不确定该怎么做。我有点自学该软件,所以请原谅任何明显的错误。

'''

class MainActivity : AppCompatActivity() {

private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)

    val adr = getIpStr()
    val serverAdr = "http://" + adr + ":5000"
    val myWebView: WebView = findViewById(R.id.webView)
    myWebView.webViewClient = WebViewClient()
    myWebView.loadUrl(serverAdr)
}

fun goToSettings(view: View) {
    val intent = Intent(this, SettingsActivity::class.java)
    startActivity(intent)
}

private suspend fun getIpStr(): String? {
    delay(2000L)
    return getByName("raspberrypi").hostAddress
}
}

'''

您需要使用 lifecycleScope:

启动协程
lifecycleScope.launch {
    val adr = getIpStr()
    val serverAdr = "http://" + adr + ":5000"
    val myWebView: WebView = findViewById(R.id.webView)
    myWebView.webViewClient = WebViewClient()
    myWebView.loadUrl(serverAdr)
}

或者,我们可以在 launch() 之外设置 webview:

val myWebView: WebView = findViewById(R.id.webView)
myWebView.webViewClient = WebViewClient()

lifecycleScope.launch {
    val adr = getIpStr()
    val serverAdr = "http://" + adr + ":5000"
    myWebView.loadUrl(serverAdr)
}

您遇到异常是因为您在主线程上启动协程。

要执行网络请求,您需要使用后台线程。为此,您可以使用带有 IO 调度程序的“launch”协程构建器在后台线程上启动新的协程。

lifecycleScope.launch(Dispatchers.IO) {
val adr = getIpStr()
val serverAdr = "http://" + adr + ":5000"
//here switch to Main thread to Update your UI related task
withContext(Dispatchers.Main){     
myWebView.loadUrl(serverAdr)}
}