2012-12-06 65 views
5

執行這行後:的Android WifiManager線程永遠不會關閉

WifiManager man = ((WifiManager) ctx.getSystemService(Context.WIFI_SERVICE)); 

標有 「WifiManager」 A線會顯示出來。在爲WifiService.java line 203 Java源文件:

HandlerThread wifiThread = new HandlerThread("WifiService"); 
wifiThread.start(); 
mWifiHandler = new WifiHandler(wifiThread.getLooper()); 

問題是,每次我們的應用程序被關閉並重新打開它創建一個新的線程時,運行5次,你有5個線程。不知道是否有阻止它?

編輯

改爲getApplicationContext,以確保它是訪問的背景是一致的,一切都很好。我仍然得到一個標有「WifiService」的線程,但我只通過多次運行獲得一個線程。

+1

我覺得你真正的問題是你有一些背景問題,所以我不會回答。但如果你想破解你通過這個問題的方式,你可以通過[gets]找到你的線程(http://stackoverflow.com/questions/1323408/get-a-list-of-all-threads-currently-running-in -java)從堆棧中的線程數組,然後通過thread.getName()進行搜索等於'WifiService',因爲ThreadHandler擴展了Thread。然後做一些像[this](http://stackoverflow.com/questions/1323408/get-a-list-of-all-threads-currently-running-in-java)。 – shibbybird

+1

誰擁有你所看到的線程?他們是否具有與您的應用程序或系統進程相同的用戶和進程ID?你是在特定的設備上還是在模擬器上看這個? 「關閉並重新打開」意味着返回/主頁並打開,或強制停止該過程?如果前者,當你做後者時會發生什麼? – Devunwired

+1

看起來像一個缺陷:http://code.google.com/p/android/issues/detail?id=43006 – user1159819

回答

3

我相信你正在開始/停止(Context) Activity中創建一個新的WifiManager。

的說明從Context.getSystemService()

注:通過此API獲得系統服務可能與它們被從所獲得的語境密切相關。 ...

ContextImpl.java:1478

而且和:227

@Override 
public Object getSystemService(String name) { 
    ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name); 
    return fetcher == null ? null : fetcher.getService(this); 
} 



... 
service = cache.get(mContextCacheIndex); 
if (service != null) { 
    return service; 
} 
... 

它使用的地圖緩存系統服務,所以我認爲,如果你使用像Application同樣情況下,你不會碰到這個問題。我不確定這是否是解決這個問題的正確方法,但是,如果有線程爲您解決更大的問題,這可能是值得的。

+0

我覺得不知何故,我應該在之前閱讀過......現在我正在嘗試。我相信這就是ShibbyBird的目標,但是對於我的密集的自我來說,沒有足夠的闡述。很快會報告回來。 – accordionfolder

2

當您使用Context.getSystemService()獲取系統服務的實例時,您並未調用該服務的構造函數。相反,您實際上正在使用IBinder獲取該服務的實例,以便對其執行遠程過程調用。因此,每次獲取它的實例時都不會調用WiFiService.java的構造函數。你究竟在哪裏看到這個線程彈出?

+0

每次我們做一個完整的啓動/關閉週期,我們得到一個新的「WifiManager」線程。如果您在調用getsystemservice之後逐步瀏覽設備上的代碼,您將立即看到新的線程啓動。我已經挖掘了源代碼和文檔,並且(就這些部分而言),我們正在做適當的「清理」。但是,我們每次啓動/停止循環都會得到一個新線程,但無法擺脫它們。 – accordionfolder

1

我希望你的應用程序是訪問WifiManager的唯一應用程序。請同時使用訪問WifiManager的虛擬應用程序進行檢查;在這種情況下,它不應該創建一個新線程。