我一直在研究這個了幾個小時,所以我會在這裏發佈我的發現。
在每個Android Web應用程序中,不僅Phonegap應用程序,只要有WebView,就會產生兩個線程:WebViewCoreThread
和WebViewWorkerThread
。它們顯示在DDMS中。我一直在閱讀Android資源,並且已經將此線程的創建跟蹤到WebViewCore.java
文件。顯然,每個應用程序進程只啓動兩個線程,並且它們由應用程序中的每個WebView共享。
恕我直言,在屏幕上使用視圖意味着產卵線程的事實是非常糟糕的設計。如果這個字段需要像開始一個線程一樣複雜,那麼它應該更好地設計爲WebViewActivity或WebWiewFragment。在任何情況下,創建線程的類也應負責在不再需要時完成它。這不幸的是並非如此。
當包含WebView的活動關閉但應用程序進程仍在運行時(可能是因爲您有其他組件,或者操作系統尚未終止它),這些線程仍在運行。核心線程將繼續執行您在應用中設置的計時器。當活動再次創建時,線程將被重用。作爲一個便箋,請注意這是如何在後臺運行javascript代碼而不必保持活動顯示的。
我嘗試了一些變通辦法在這個問題暴露一個普通WevView的:WebView threads never stop (WebViewCoreThread, CookieSyncManager, http[0-3]),
,但由於一些未知的原因,它不與PhoneGap的工作。我試圖重寫我的DroidGap子是這樣的:
@Override
public void onDestroy(){
System.out.println("Activity destroyed");
if(appView != null){ //This is a protected reference to the `CordovaWebView`, extending `WebView`
//First attempt
try {
Class.forName("android.webkit.WebView").getMethod("onPause", (Class[]) null).invoke(appView, (Object[]) null);
} catch (Exception e) {
e.printStackTrace();
}
//Second attempt
appView.pauseTimers();
}
super.onDestroy();
}
因此,我終於做到了在退出應用前,確保所有的計時器都從JavaScript代碼取消。然而,人們會希望在Android操作系統代碼中修正這個問題,或者在Phonegap中進行修補,因爲即使在最好的情況下,這些線程也浪費了當沒有顯示網頁時真正不需要的資源。而在最糟糕的情況下,一些與DOM相關的JavaScript代碼可能會崩潰。
只是爲了分享,我經歷過同樣的事情。不知何故,儘管應用程序已關閉,並且如果我們有一些計時器(例如使用setInterval),它有時仍會繼續運行。我的理論是,應用程序被銷燬,但webview不知何故仍然在執行的內存中? – wmfairuz 2013-04-09 11:15:19
我目前正在真實設備上調試它。有一個「WebViewCoreThread」在關閉活動後仍然在運行。我發現這個問題,可能與此有關:http://stackoverflow.com/q/2040963/813951 – 2013-04-09 11:23:01
這很奇怪。應用程序被銷燬後,webview如何仍然活着? – wmfairuz 2013-04-09 11:34:24