5

我正在开发一个包含 Web 视图的应用程序。在应用程序期间的特定时间,它会调用 Webview loadUrl。

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

我遇到的是,当来自 UI 线程时 loadUrl() 工作正常,但是当它来自工作线程时它无法工作(即使对 loadUrl 的实际调用是通过我传递给 runOnUIThread() 的可运行对象发生的)。

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

我目前正在筛选 Android Webview 源代码,看看我是否可以追踪为什么有时它有效而有时它不工作。如果有人能对此事有所了解,将不胜感激。

- - 更新 - -

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

在调用loadUrl之前主要做以下事情:

webView.clearCache(true);
webView.loadUrl("Url");

和:

webView.clearCache(true);
webView.clearView();
webView.reload();
webView.loadUrl("about:blank");
webView.loadUrl("Url");

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

4

1 回答 1

2

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

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

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

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

或者你可以像这样调用 webview

runOnUiThread(new Runnable() {

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

            }
        });
于 2014-08-27T10:19:45.967 回答