6

我正在开发一个应用程序,它利用WebView登录到网站,从中提取内容,然后在内容更新时通知用户。我已经获得了WebView来获取内容,但是我需要知道如何将WebView作为服务运行以使其在后台运行。在后台运行WebView

据我所知,必须从UI线程操纵WebViews,这使事情变得更加困难。

有关如何让应用程序通知用户而不管他们是否打开应用程序的任何建议/解决方法?

回答

6

虽然WebViews需要在单个线程上操作,但它不一定需要是UI线程(除非要将WebView附加到视图层次结构中),但是它需要与所有WebViews。

虽然它不是明确支持(或经过严格测试)的东西,但没有什么特别的,WebView会阻止您在服务中运行它。 WebView在Context中调用了一些通常不在Service中工作的方法(比如getTheme()),所以你必须用ContextWrapper解决这个问题。您还需要手动调用WebView.layout来诱使WebView认为它具有大小。可能还有更多你需要做的事情,但是没有其他想法。

+0

如果您的HTML选择对话框崩溃,请参阅https://code.google.com/p/android-developer-preview/issues/detail?id=359#c7。 –

+2

这似乎不再是真的 - 似乎它必须是UI线程。当我尝试在另一个线程中创建WebView时:“java.lang.RuntimeException:java.lang.Throwable:Warning:在线程'UtilityWebViewServiceThread'上调用WebView方法。必须在UI线程上调用所有WebView方法。未来版本的WebView可能不支持在其他线程上使用。“ – David

+0

为我工作,特别是“WebView.layout()”手动调用。我从intentservice创建webview,谢谢。 – carrizo

2

你的意思是?

runOnUiThread(new Runnable(){ 
     public void run() { 
      ... something 
     } 
    }); 
1

您不能从后台线程膨胀或修改任何视图。但是如果你想要一个网页的内容,你可以使用HTTP GET在后台线程中获取它。您需要在网址上使用GET来获取其HTML数据。