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)
不幸的是,它们都不起作用。
一般来说,在主线程之外创建视图是不安全的。
在您的特定情况下,这是不允许的,因为 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)
| 归档时间: |
|
| 查看次数: |
3606 次 |
| 最近记录: |