Kotlin: все методы WebView должны вызываться в одном потоке - PullRequest
0 голосов
/ 03 марта 2020

Это мой 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")
    }
}

Но это кража sh.

Причина: java .lang.Throwable: метод WebView был вызван в потоке 'JavaBridge'. Все методы WebView должны вызываться в одном потоке.

Как я могу это исправить? Я нашел решение путем поиска, но это был java код. Kotlin и Java совместимы, но не работают из-за синтаксической ошибки. (Я думаю, это потому, что я не знаю Kotlin и Java. В любом случае)

Я - разработчик полного стека на JavaScript и у меня нет никаких знаний Android, так что Я только хотел использовать веб-просмотров. Но это тоже очень сложно для меня. (Это как период хаоса, когда я впервые узнал JavaScript.)

Пожалуйста, сообщите мне решение. пс. Если у вас есть хороший список понятий наследования и области действия Kotlin, пожалуйста, ссылку.

Ответы [ 3 ]

1 голос
/ 03 марта 2020

Попробуйте

mWebView.post(object:Runnable { 
public override fun run() { 
   mWebView.loadUrl("") 
   } 
}) 
1 голос
/ 03 марта 2020

Поскольку ссылка, которую вы разместили здесь, проблема в том, что

метод JavaScript выполняется в фоновом потоке (т.е. не в пользовательском интерфейсе). Вам нужно вызвать все 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 разработчиков, может помочь начать с kotlin https://dev.to/cassiozen/kotlin-for-js-devs-part-1-5bld

1 голос
/ 03 марта 2020

Вы должны использовать Runnable и отправить в Обработчик WebView .

myWebView.post(Runnable {
   myWebView.loadUrl("file:///android_asset/index.html")
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...