首页 > 解决方案 > 在 onPageFinished 之前调用 return

问题描述

我有一个 WebView 用于一些简单的网络抓取,它工作正常,但是当我将它放在一个函数中并尝试返回它抓取的任何内容时,在 WebView 甚至抓取之前调用返回部分。我怎样才能让它在调用返回之前等待,因为在 onPageFinished 内返回是不可能的?

fun loadText() : String {
        myWebView2 = findViewById(R.id.webView2)
        var stringToBeReturned = ""
        myWebView2.settings.javaScriptEnabled = true
        myWebView2.webViewClient = object : WebViewClient() {
            override fun onPageFinished(view: WebView, url: String) {
                super.onPageFinished(myWebView2, url)
                myWebView2.evaluateJavascript("(function() { return ('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>'); })();") { value ->
                    stringToBeReturned = value.substringAfter("on \\u003C/span>\\u003Ca href=\\\"").substringBefore('\\')
                }
            }
        }
        myWebView2.loadUrl("https://www.examplewebsite.com")

        return stringToBeReturned
    }

标签: androidkotlinandroid-webview

解决方案


onPageFinished()是一个回调,在你的函数返回后被异步调用(只要页面被加载) 。

您不应该在函数中包含此回调。而是在 中进行配置onCreate(),设置回调并传递resultString,一旦可用,无论您需要它:

  override fun onCreate(savedInstanceState: Bundle?) {
    val webView: WebView = findViewById(R.id.webView2)
    webView.settings.javaScriptEnabled = true

    webView.webViewClient = object : WebViewClient() {
            override fun onPageFinished(view: WebView, url: String) {
                // this function gets called as soon the page has been loaded
                super.onPageFinished(view, url)
                webView.evaluateJavascript("(function() { return ('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>'); })();") { value ->
                    val resultString = value.substringAfter("on \\u003C/span>\\u003Ca href=\\\"").substringBefore('\\')
                    // pass resultString wherever you need it
                }
            }
    }
  }

推荐阅读