android - 在 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
}
解决方案
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
}
}
}
}
推荐阅读
- mysql - CONCAT 子串
- seo - 遵循 JSON-LD 的 @id 引用的结构化数据测试工具——这会按预期工作吗?
- python-3.x - 如何声明返回对象数组的函数?
- android - 具有不同参数改造的多个 Post 请求
- javascript - 使用本地存储预填表单
- python - Python:解析 XML 将(十六进制)转义视为文字字符串
- mysql - MySQL Workbench 查询统计:服务器和客户端时间?
- extjs - ExtJS - 无法绑定列标题
- javascript - 需要单个文件的最简洁的方式?
- android - 生成签名的apk时是否必须启用minify