Android Webview从工作线程加载URL无法正常工作

5

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

有时,该调用直接来自UI线程上的事件,而其他时候则来自后台工作线程上的事件。当它起源于后台线程时,我会调用runOnUIThead(),以确保实际调用loadURL发生在UI线程上。

我所经历的是,当起源于UI线程时,loadUrl()运行良好,但是从工作线程时它无法正常工作(尽管我通过传递到runOnUIThread()中的可运行对象来实际调用loadUrl())。

通过设置断点,我可以看到,在两种情况下,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");

很遗憾,它们都不起作用。
1个回答

2
一般情况下,在主线程之外创建视图是不安全的。
在您的特定情况下,这是不允许的,因为WebView在其构造函数中创建Handler()以与UI线程通信。但由于Handler的默认构造函数会将其附加到当前线程,而当前线程没有运行Looper,因此您会收到此异常。
您可能认为创建一个Looper线程(必须至少活动与WebView一样长时间)可能会帮助您,但这实际上是一种冒险的方式。我不建议这样做。
您应该坚持在主线程中创建WebViews。所有控件通常都针对快速构建进行了优化,因为它们几乎总是在UI线程中创建。
或者您可以像这样调用webview
runOnUiThread(new Runnable() {

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

            }
        });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接