当前位置: 首页 > 知识库问答 >
问题:

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

汪耀
2023-03-14

这是我的kotlin代码:

class WebAppInterface(private val mContext: Context, private val myWebView: WebView) {
    @JavascriptInterface
    fun goToHello() {
        val myWebView = myWebView
        myWebView.loadUrl("file:///android_asset/hello.html")
    }
}

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val myWebView: WebView = findViewById(R.id.webview)
        myWebView.settings.javaScriptEnabled = true
        myWebView.addJavascriptInterface(WebAppInterface(this, myWebView), "Android")
        myWebView.loadUrl("file:///android_asset/index.html")
    }
}

但这是崩溃。

引起:java.lang.Throwable:在线程JavaBridge上调用了WebView方法。所有WebView方法必须在同一个线程上调用。

我怎样才能解决这个问题?我通过搜索找到了解决方案,但这是java代码。Kotlin和Java兼容,但由于语法错误而未运行。(我想这是因为我不知道Kotlin和Java。无论如何)

我是一个基于JavaScript的全栈开发人员,我没有任何Android知识,所以我只想使用网络视图。但这对我来说也很难。(这就像我第一次学习JavaScript时的混乱时期。)

请告诉我解决办法。如果你有Kotlin的继承和范围概念的好列表,请链接。

共有3个答案

宿丰
2023-03-14

试试这个

mWebView.post(object:Runnable { 
public override fun run() { 
   mWebView.loadUrl("") 
   } 
}) 
彭存
2023-03-14

正如你在这里发布的链接,问题在于

JavaScript方法在后台(即非UI)线程上执行。您需要在UI线程上调用所有与Android视图相关的方法。您可以通过以下方式实现所需:

Kotlin解决方案如下

    val myWebView: WebView = findViewById(R.id.webview)
    //Apply webview's properties if it's not null
    myWebView?.run {
        settings.javaScriptEnabled = true
        addJavascriptInterface(WebAppInterface(this, myWebView), "Android")
        post {
            loadUrl("file:///android_asset/index.html")
        }
    }

正如您在这里看到的,这里有一条特殊的指令run这条指令是kotlin作用域函数的一部分。

这本为javascript开发人员设计的教程可能有助于启动kotlinhttps://dev.to/cassiozen/kotlin-for-js-devs-part-1-5bld

应俊爽
2023-03-14

您应该使用Runnable和Post to WebView Handler。

myWebView.post(Runnable {
   myWebView.loadUrl("file:///android_asset/index.html")
})
 类似资料:
  • 问题内容: 方法getText()必须从UI线程调用,请提供帮助。我是android studio的初学者,可以在网上找到这些代码,但无法弄清楚,我真的很感激。 问题答案: 在其UI线程而非后台线程中获取值。

  • 我有一个Android程序(Java网页视图中的html)。我可以从javascript调用Java代码。但是另一种方法停止工作(在eclipse中更新后)。 所以这就是我想做的 创建网络视图(已工作) 我试着让它在MainActivity中与WebView一起工作,但没有成功。 主要活动。JAVA Javascript。JAVA 错误: 谢谢你的回答。我在Javascript文件中编辑了函数,如

  • 我试图从WebView中javascript调用的方法调用WebView方法。然后Webview应该返回方法中使用的值。 html事件- 显然,Webview在ui线程中运行,而js不运行,webview的方法必须从同一个线程调用。此方法可用于从非ui线程调用方法: 但我也想返回结果<代码>返回webView。例如,getUrl()。我该怎么做?

  • 问题内容: 我正在尝试为应用程序创建登录名。但是我有一个问题。 这是我的代码: Android studio表示必须在istructions的UI线程中调用该方法:以及 可能的解决方案? 问题答案: 尝试将您的值传递给 via 方法:

  • 看起来它工作得很好,但我想知道我是否必须确保新代码需要线程安全?这里有什么意见吗?抱歉用了假名字,提前致谢。

  • 我最近了解到,Sun/Oracle最新的指导方针规定,任何Swing对象的Swing方法(包括构造函数)都不能在EDT之外调用。 http://www.velocityreviews.com/forums/t707173-why-does-jdk-1-6-rovidens-creating-swing-components-on-the-edt.html 引用:“除了实际的线程安全和相关的问题,如