我試圖在我的 android 應用程式中運行 getByName 方法,但發現在主要活動中這樣做是值得關注的。我知道我需要使用協程、異步或執行緒。但我不知道該怎么做。我對軟體有點自學,所以請原諒任何明顯的錯誤。
'''
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
}
}
'''
uj5u.com熱心網友回復:
你得到例外是因為你在主執行緒上啟動你的協程。
要執行網路請求,您需要使用后臺執行緒。為此,您可以使用帶有 IO 調度程式的“啟動”協程構建器在后臺執行緒上啟動新的協程。
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)}
}
uj5u.com熱心網友回復:
您需要使用以下命令啟動協程lifecycleScope:
lifecycleScope.launch {
val adr = getIpStr()
val serverAdr = "http://" adr ":5000"
val myWebView: WebView = findViewById(R.id.webView)
myWebView.webViewClient = WebViewClient()
myWebView.loadUrl(serverAdr)
}
或者,我們可以在以下位置設定 webview launch():
val myWebView: WebView = findViewById(R.id.webView)
myWebView.webViewClient = WebViewClient()
lifecycleScope.launch {
val adr = getIpStr()
val serverAdr = "http://" adr ":5000"
myWebView.loadUrl(serverAdr)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/425275.html
