kotlin @ Javascript接口内的Webview.loadurl将使应用程序崩溃

tquggr8v  于 2023-01-21  发布在  Kotlin
关注(0)|答案(2)|浏览(128)

我有一个webview,它运行在主线程上,我调用webview. loadurl("www.example.com")https://www.google.com")
装载良好。
webview有如下设置,所以javascript函数调用一些本机函数。
添加Javascript接口(此,名称)
并且该类有一个带@Javascript接口注解的方法

@JavascriptInterface
fun getTestData(){
**webview.loadURL("https://www.facebook.com")**
}

粗体的**webview. loadURL("www.example.com")**崩溃,并显示以下错误:https://www.facebook.com在线程"JavaBridge"上调用了WebView方法。必须在同一线程上调用所有WebView方法。(预期在Looper(JavaBridge,tid 1144){e018910}上调用了Looper Looper(main,tid 2){95d9516},仅供参考主Looper是Looper(main,tid 2){95d9516}) java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {95d9516} called on Looper (JavaBridge, tid 1144) {e018910}, FYI main Looper is Looper (main, tid 2) {95d9516})
我已经检查了线程,webview正在主线程上运行,虽然控件在方法getTestData()下,但线程是javabridge。
任何帮助都将不胜感激

mitkmikd

mitkmikd1#

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

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

从堆栈跟踪:
必须在同一线程上调用所有WebView方法
并且您始终在UI线程中创建WebView示例(因为这是View,所以应该绘制...)
此外,如果您在Activity中,则可以使用runOnUiThread{}

yyhrrdl8

yyhrrdl82#

您需要调用Android Web视图相关的UI线程的东西。

webView.post {
    webView.loadUrl("https://www.facebook.com")
}

相关问题