2014-01-09 44 views
4

我正在开发一个包含Web视图的应用程序。在应用程序中的某个时间,它会调用Webview loadUrl。来自工作线程的Android Webview loadUrl不起作用

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

我所遇到的是loadUrl()在从UI线程发起时工作正常,但是当它来自工作线程时它无法工作(即使实际调用loadUrl是通过runnable发生的,我传入runOnUIThread ())。

设置了一个断点后,我可以看到在这两个实例中,在UI线程上调用了loadUrl()。然而它在一个案例中起作用,但不是另一个。

我目前正在筛选通过Android网页视图源代码,看看我是否能追查为什么有时工作,有时没有。如果任何人都可以在这个问题上解决任何问题,将不胜感激。

--- UPDATE ---

我从这个职位在这里尝试了一些建议: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

一般来说,在主线外创建视图并不安全。

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

你可能会认为,创造一个弯针线(即必须是活至少只要WebView中)可以帮助你,但其实这有风险的路要走。我不会推荐它。

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

,或者您可以拨打的WebView这样

runOnUiThread(new Runnable() { 

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

      } 
     });