如何检查变量值是否在 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()
            }
        })
    }