如何在 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)}
}
我正在尝试 运行 我的 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)}
}