【问题标题】:Kotlin: All WebView methods must be called on the same threadKotlin:所有 WebView 方法必须在同一个线程上调用
【发布时间】:2020-03-03 04:48:17
【问题描述】:

这是我的 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 方法必须在同一个线程上调用。

我该如何解决这个问题? 我通过搜索找到了solution,但这是java代码。 Kotlin 和 Java 兼容,但由于语法错误而无法运行。 (我想是因为我不懂 Kotlin 和 Java。反正)

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

请告诉我解决方案。 附言。如果您有 Kotlin 的继承和范围概念的良好列表,请链接。

【问题讨论】:

  • 请尝试评论myWebView.loadUrl("file:///android_asset/hello.html")from 'fun goToHello(...)' 并在此处打印一些日志并检查它是否崩溃。

标签: android kotlin webview


【解决方案1】:

你应该使用 Runnable 和 Post to WebView Handler

myWebView.post(Runnable {
   myWebView.loadUrl("file:///android_asset/index.html")
})

【讨论】:

  • 谢谢。你是我的救星。解决方案代码显示了我的 kotlin 知识有多差。 ?
  • 不提。我们在这里是团队。 ?
  • myWebView.post { myWebView.loadUrl("file:///android_asset/index.html") }
【解决方案2】:

作为您在此处发布的链接,问题是因为

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

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 开发人员设计的教程可能有助于开始使用 kotlin https://dev.to/cassiozen/kotlin-for-js-devs-part-1-5bld

【讨论】:

  • 真的非常感谢。这对我来说非常棒 * 999 链接。
  • 我很乐意提供帮助!
【解决方案3】:

试试这个

mWebView.post(object:Runnable { 
public override fun run() { 
   mWebView.loadUrl("") 
   } 
}) 

【讨论】:

  • 我已经更新了 kotlin 中的代码,你也可以使用 try.kotlinlang.org 将 java 代码转换为 kotlin
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多