@JavascriptInterface 中的Webview.loadurl 会使应用程序崩溃

问题描述 投票:0回答:3

我有一个 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。

如有任何帮助,我们将不胜感激

android kotlin
3个回答
0
投票

在 UI 线程中运行代码,JS 接口在其他线程中调用(看起来像)

@JavascriptInterface
fun getTestData(){
    Handler(Looper.getMainLooper()).post {
        webview.loadURL("https://www.facebook.com")
    }
}

来自堆栈跟踪:

所有WebView方法必须在同一个线程上调用

并且您始终在 UI 线程中创建

WebView
实例(因为这是
View
,应该绘制...)

如果您在

Activity
那么您可以使用
runOnUiThread{}


0
投票

在Android中,WebView操作必须在主UI线程上执行

例如:

fun enableZoom() {
    runOnUiThread {
        webView.setInitialScale(0)
        webView.settings.setSupportZoom(true)
    }
}

runOnUiThread {
    webView?.evaluateJavascript(JavaScript.SOMETHING) { … }
}

-1
投票

需要在UI线程中调用Android Web view相关的东西。

webView.post {
    webView.loadUrl("https://www.facebook.com")
}
© www.soinside.com 2019 - 2024. All rights reserved.