我有一个 webview,它在主线程上运行,我正在调用 webview.loadurl("https://www.google.com")
加载正常。
webview 有以下设置,因此 javascript 函数调用一些本机函数。
webView.addJavascriptInterface(这个,名称)
这个类有一个带有@JavascriptInterface注释的方法
@JavascriptInterface
fun getTestData(){
**webview.loadURL("https://www.facebook.com")**
}
粗体的 webview.loadURL("https://www.facebook.com") 因以下错误而崩溃: java.lang.Throwable:在线程“JavaBridge”上调用了 WebView 方法。所有 WebView 方法必须在同一线程上调用。 (预期的LooperLooper(main, tid 2) {95d9516}在Looper(JavaBridge, tid 1144) {e018910}上调用,仅供参考,main Looper是Looper(main, tid 2) {95d9516})
我已经检查了线程,并且 webview 正在主线程上运行,虽然控制权位于方法 getTestData() 下,但线程是 javabridge。
如有任何帮助,我们将不胜感激
在 UI 线程中运行代码,JS 接口在其他线程中调用(看起来像)
@JavascriptInterface
fun getTestData(){
Handler(Looper.getMainLooper()).post {
webview.loadURL("https://www.facebook.com")
}
}
来自堆栈跟踪:
所有WebView方法必须在同一个线程上调用
并且您始终在 UI 线程中创建
WebView
实例(因为这是 View
,应该绘制...)
如果您在
Activity
那么您可以使用 runOnUiThread{}
在Android中,WebView操作必须在主UI线程上执行
例如:
fun enableZoom() {
runOnUiThread {
webView.setInitialScale(0)
webView.settings.setSupportZoom(true)
}
}
和
runOnUiThread {
webView?.evaluateJavascript(JavaScript.SOMETHING) { … }
}
需要在UI线程中调用Android Web view相关的东西。
webView.post {
webView.loadUrl("https://www.facebook.com")
}