2012-12-06 10 views
5

をシャットダウンすることはありません:アンドロイドWifiManagerスレッドは、この行を実行した後

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

「WifiManager」と表示されたスレッドが表示されます。 WifiService.java line 203のJavaソースファイルで:

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

問題があり、我々のアプリを閉じて、それが新しいスレッドを作成し、再び開かれるたびに、それを5回実行すると、あなたは5つのスレッドを持っています。とにかくそれを止めることができるかどうか分かりませんか?それがアクセスしていたコンテキストが一致していたし、すべてが順調だったことを確認するgetApplicationContextに変更

EDIT

。私はまだ "WifiService"というラベルのスレッドを手に入れましたが、私は複数回にわたって1つのスレッドしか取得しません。

+1

私はあなたの本当の問題のように、文脈の問題があると感じているので、私は答えません。しかし、あなたはこの問題をあなたの方法をハックしたい場合は、あなたのスレッドを見つけることができます[取得](http://stackoverflow.com/questions/1323408/get-a-list-of-all-threads-currently-running-in -java)スタックからスレッドの配列を取得し、Thread.getName()で検索すると、ThreadHandlerがThreadを拡張するため、 'WifiService'と同じになります。次に[this]のようなことをしてください(http://stackoverflow.com/questions/1323408/get-a-list-of-all-threads-currently-running-in-java)。 – shibbybird

+1

あなたが見ているスレッドを所有しているのは誰ですか?アプリケーションやシステムプロセスと同じユーザーIDとプロセスIDを持っていますか?特定のデバイスやエミュレータでこれを調べていますか? 「閉じて再オープン」は、BACK/HOMEに移動して開くか、強制的にプロセスを停止することを意味しますか?前者の場合、後者をするとどうなりますか? – 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にアクセスするダミーアプリケーションと同時にチェックしてください。その場合、新しいスレッドを作成すべきではありません。

関連する問題