如何检查变量值是否在 Kotlin 的其他线程中更改?
How to check if variable value is Changed in other thread in Kotlin?
我正在尝试更改我的 WebViewClient 中的变量,但我的函数不等待页面加载。我认为这是因为 WebView 有自己的线程。如果是这种情况,那么我该如何暂停我的功能以等待页面。还是有任何其他方法可以将值保留在我的函数中?
private fun getNewUrl(url: String): String {
var newUrl = "null"
val webView = WebView(applicationContext)
webView.webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
Toast.makeText(applicationContext, "Page Loaded", Toast.LENGTH_SHORT).show()
newUrl = url.toString()
}
}
webView.loadUrl(url)
return newUrl
}
是的。因为该调用是异步发生的。它不会阻止以下行的执行。
因此您需要在加载该结果时调用您的侦听器 class 并使用该结果。
例如:
创建接口:
interface OnPageLoadedListener {
fun onLoaded(url: String)
}
将其作为参数传递给您的函数:
private fun getNewUrl(url: String, onPageLoadedListener: OnPageLoadedListener) {
var newUrl: String
val webView = WebView(applicationContext)
webView.webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
Toast.makeText(applicationContext, "Page Loaded", Toast.LENGTH_SHORT).show()
pageUrl = url.toString()
newUrl = url.toString()
onPageLoadedListener.onLoaded(newUrl)
}
}
webView.loadUrl(url)
}
调用你的函数:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
getNewUrl("https://www.google.com/", object : OnPageLoadedListener {
override fun onLoaded(url: String) {
Toast.makeText(applicationContext, url, Toast.LENGTH_SHORT).show()
}
})
}
我正在尝试更改我的 WebViewClient 中的变量,但我的函数不等待页面加载。我认为这是因为 WebView 有自己的线程。如果是这种情况,那么我该如何暂停我的功能以等待页面。还是有任何其他方法可以将值保留在我的函数中?
private fun getNewUrl(url: String): String {
var newUrl = "null"
val webView = WebView(applicationContext)
webView.webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
Toast.makeText(applicationContext, "Page Loaded", Toast.LENGTH_SHORT).show()
newUrl = url.toString()
}
}
webView.loadUrl(url)
return newUrl
}
是的。因为该调用是异步发生的。它不会阻止以下行的执行。
因此您需要在加载该结果时调用您的侦听器 class 并使用该结果。
例如:
创建接口:
interface OnPageLoadedListener {
fun onLoaded(url: String)
}
将其作为参数传递给您的函数:
private fun getNewUrl(url: String, onPageLoadedListener: OnPageLoadedListener) {
var newUrl: String
val webView = WebView(applicationContext)
webView.webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
Toast.makeText(applicationContext, "Page Loaded", Toast.LENGTH_SHORT).show()
pageUrl = url.toString()
newUrl = url.toString()
onPageLoadedListener.onLoaded(newUrl)
}
}
webView.loadUrl(url)
}
调用你的函数:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
getNewUrl("https://www.google.com/", object : OnPageLoadedListener {
override fun onLoaded(url: String) {
Toast.makeText(applicationContext, url, Toast.LENGTH_SHORT).show()
}
})
}