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

Kotlin: All WebView methods must be called on the same thread

这是我的科特林代码:

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")
    }
}

但是它崩溃了。

Caused by: java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread.

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

我是一名 Java 基于脚本的全栈开发人员,我没有任何 Android 知识,所以我只想使用网络视图。 但这对我来说也很难。 (好像刚开始学JavaScript的那段混沌时期。)

请告诉我解决方法。 ps。如果您有 Kotlin 的继承和作用域概念的良好列表,请link。

您应该使用 Runnable 和 Post 到 WebView 处理程序

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

试试这个

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

正如您在此处发布的 link 问题是因为

the JavaScript method is executed on a background (i.e. non-UI) thread. You need to call all Android View related methods on the UI thread. You can achieve what you need with:

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