【问题标题】:Android Webview loadUrl does not work when coming from a worker thread来自工作线程时,Android Webview loadUrl 不起作用
【发布时间】:2014-01-09 13:31:13
【问题描述】:

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

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

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

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

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

--- 更新 ---

我在这里尝试了这篇帖子的一些建议:WebView loadUrl works only once

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

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

还有:

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

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

【问题讨论】:

    标签: java android multithreading webviewrunonuithread


    【解决方案1】:

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

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

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

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

    或者你可以这样调用webview

    runOnUiThread(new Runnable() {
    
                @Override
                public void run() {
                    //    your webview method
    
                }
            });
    

    【讨论】:

      猜你喜欢
      • 2015-09-03
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多