【问题标题】:Opening a WebView using Coroutines in Kotlin在 Kotlin 中使用协程打开 WebView
【发布时间】:2020-01-09 13:45:52
【问题描述】:

我正在尝试使用 Coroutines 从我的 BottomNavBar 打开一个 WebView,但出现此错误:

java.lang.RuntimeException: java.lang.Throwable: 一个 WebView 方法是 在线程“DefaultDispatcher-worker-1”上调用。所有 WebView 方法 必须在同一个线程上调用。

我的代码如下所示:

class WebViewFragment : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_web_view, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        openWebView()
    }

    private suspend fun showWebView(){
        if(webView != null){

            webView!!.webViewClient = WebViewClient()
            webView!!.webChromeClient = WebChromeClient()

            val webSettings = webView!!.settings
            webSettings.javaScriptEnabled = true

            webView!!.loadUrl("https://www.google.com")

            webView!!.webViewClient = object: WebViewClient(){
                override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
                    progressBar.visibility = View.VISIBLE
                    super.onPageStarted(view, url, favicon)
                }

                override fun onPageFinished(view: WebView?, url: String?) {
                    progressBar.visibility = View.GONE
                    super.onPageFinished(view, url)
                }
            }
        }
    }

    private fun openWebView(){
        runBlocking(Dispatchers.Default) {
            showWebView()
        }
    }
}

有没有最好的方法来实现这一点? WebView 可以加载到另一个线程而不是 UI 线程上吗?

谢谢:

【问题讨论】:

    标签: android multithreading kotlin webview kotlin-coroutines


    【解决方案1】:

    Dispatchers.Default 在后台使用线程池,并且异常告诉您WebView 期望从相同的Thread 调用其方法,在这种情况下为 UI Thread。

    另外,docs runBlocking 只能用于主要功能和测试,因为它会阻塞调用者 Thread,直到协程完成。

    WebView 可以加载到另一个线程而不是 UI 线程吗?

    不,WebView 方法应该从 UI 调用 Thread

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2022-01-20
      • 1970-01-01
      • 2020-06-07
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多