2012-12-06 19 views
5

Po wykonaniu tej linii:Android WifiManager Temat nie wyłącza

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

Wątek oznaczony "WifiManager" pojawi się. W pliku źródłowego Java dla WifiService.java line 203:

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

Problem polega na tym, za każdym razem nasza aplikacja jest zamknięty i ponownie tworzy nowy wątek, uruchom go 5 razy i masz 5 wątków. Nie jesteś pewien, czy tak jest, aby to zatrzymać?

EDIT

Zmieniono getApplicationContext aby upewnić się, że kontekst było dostępu było zgodne i wszystko było dobrze. Nadal mam wątek oznaczony "WifiService", ale otrzymuję tylko jeden wątek w wielu seriach.

+1

Czuję, że twoim prawdziwym problemem jest to, że masz problemy z kontekstem, więc nie odpowiem. Ale jeśli chcesz zhackować sobie drogę przez ten problem, możesz znaleźć swój wątek przez [dostanie] (http://stackoverflow.com/questions/1323408/get-a-list-of-all-threads-currently-running-in -java) tablicę wątków ze stosu, a następnie wyszukiwanie przez thread.getName() jest równe "WifiService", ponieważ ThreadHandler rozszerza wątek. Następnie wykonaj coś w stylu [this] (http://stackoverflow.com/questions/1323408/get-a-list-of-all-threads-currently-running-in-java). – shibbybird

+1

Kto jest właścicielem wątków, które widzisz? Czy mają ten sam identyfikator użytkownika i procesu, co twoja aplikacja lub proces systemowy? Czy patrzysz na to na konkretnym urządzeniu lub emulatorze? Czy "zamknięty i ponownie otwarty" oznacza przejście do BACK/HOME i otwarcie, czy Force Stopping the process? Jeśli pierwszy, co się dzieje, gdy robisz to drugie? – Devunwired

+1

wygląda jak wada: http://code.google.com/p/android/issues/detail?id=43006 – user1159819

Odpowiedz

3

Wydaje mi się, że tworzysz nowy WifiManager w swoim uruchomionym/zatrzymanym (Context) Activity.

notę ​​Context.getSystemService()

Uwaga: Usługi systemowe uzyskane za pomocą tego interfejsu API mogą być ściśle związane z kontekstu, w jakim są one uzyskane od. ...

Również z ContextImpl.java:1478 i :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; 
} 
... 

Wykorzystuje mapę do usług systemowych cache, więc wierzę, jeśli używasz tego samego kontekstu jak Application, to nie napotkasz ten problem. Nie jestem pewien, czy jest to właściwy sposób rozwiązania tego problemu, ale jeśli masz wątki układające się dla ciebie z większym problemem, może warto.

+0

Czuję, że powinienem to przeczytać wcześniej .... Próbuję teraz. Sądzę, że właśnie to robił ShibbyBird, ale nie rozwinął się wystarczająco daleko, aby moja gęsta osoba mogła się dostać. Niedługo odpowiemy. – accordionfolder

2

Po uzyskaniu wystąpienia usługi systemowej za pomocą metody Context.getSystemService() nie wywołuje się konstruktora usługi. Zamiast tego dostajesz instancję usługi za pomocą programu IBinder, aby wykonać zdalne wywołanie procedury. Zatem konstruktor WiFiService.java nie będzie wywoływany za każdym razem, gdy pojawi się jego instancja. Gdzie dokładnie pojawia się ten wątek?

+0

Za każdym razem, gdy wykonujemy pełny cykl uruchamiania/zamykania, otrzymujemy nowy wątek "WifiManager".Jeśli przejdziesz przez kod na urządzeniu po wywołaniu getsystemservice, natychmiast zobaczysz początek nowego wątku. Przeszukałem kod źródłowy i dokumentację oraz (o ile chodzi o te części), robimy odpowiednie "porządki". Ale otrzymujemy nowy wątek na cykl startu/stopu bez możliwości pozbycia się ich. – accordionfolder

1

Mam nadzieję, że aplikacja jest jedyną aplikacją, która uzyskuje dostęp do WifiManager. Proszę sprawdzić w tym samym czasie jakąś fikcyjną aplikację, która ma dostęp do WifiManager; w takim przypadku nie powinien tworzyć nowego wątku.

Powiązane problemy