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
这是我的科特林代码:
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