来自工作线程的Android Webview loadUrl不起作用

Sma*_*esy 5 java multithreading android webviewrunonuithread

我正在开发一个包含网络视图的应用程序。在应用程序中的某些时间,它会调用Webview loadUrl。

有时,调用将直接来自UI线程上的事件,而有时,调用来自后台工作线程上的事件。当它来自后台线程时,我调用runOnUIThead()以确保对loadURL的实际调用发生在UI线程上。

我正在体验的是,当loadUrl()源自UI线程时,它工作正常,但是当它来自工作线程时,它却无法工作(即使对loadUrl的实际调用是通过我传递给runOnUIThread()的可运行的)进行的。

设置断点后,我可以看到在两种情况下都在UI线程上调用了loadUrl()。但是它在一种情况下有效,而在另一种情况下无效。

我目前正在筛选Android Webview源代码,以查看是否可以追踪为何有时起作用而有时不起作用的原因。如果有人可以对此事发表任何意见,将不胜感激。

-更新-

我从这里的这篇文章中尝试了一些建议:WebView loadUrl仅工作一次

在调用loadUrl之前主要执行以下操作:

webView.clearCache(true);
webView.loadUrl("Url");
Run Code Online (Sandbox Code Playgroud)

和:

webView.clearCache(true);
webView.clearView();
webView.reload();
webView.loadUrl("about:blank");
webView.loadUrl("Url");
Run Code Online (Sandbox Code Playgroud)

不幸的是,它们都不起作用。

Har*_*han 2

一般来说,在主线程之外创建视图是不安全的。

在您的特定情况下,这是不允许的,因为 WebView 在其构造函数中创建 Handler() 以便与 UI 线程通信。但由于 Handler 的默认构造函数将自身附加到当前线程,并且当前线程没有运行 Looper,因此您会收到此异常。

您可能认为创建一个循环线程(必须至少与 WebView 一样长)可能对您有帮助,但这实际上是一种冒险的方法。我不会推荐它。

您应该坚持在主线程中创建 WebView。所有控件通常都针对快速构建进行了优化,因为它们几乎总是在 UI 线程中创建。

或者你可以这样调用 webview

runOnUiThread(new Runnable() {

            @Override
            public void run() {
                //    your webview method

            }
        });
Run Code Online (Sandbox Code Playgroud)