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數據。