5

この行を実行した後:

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

「WifiManager」というラベルの付いたスレッドが表示されます。WifiService.javaの Java ソース ファイルの203 行目:

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

問題は、アプリを閉じて再度開くたびに新しいスレッドが作成され、5 回実行すると 5 つのスレッドが作成されることです。とにかくそれを止める方法があるかどうかわかりませんか?

編集

getApplicationContext に変更して、アクセスしているコンテキストが一貫しており、すべてが正常であることを確認しました。「WifiService」というラベルの付いたスレッドはまだ取得できますが、複数の実行で取得できるスレッドは 1 つだけです。

4

3 に答える 3

3

started/stopped に新しい WifiManager を作成していると思います(Context) Activity

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この問題は発生しないと思います。これがこの問題を解決する正しい方法であるかどうかはわかりませんが、より大きな問題の周りにスレッドが配置されている場合は、価値があるかもしれません.

于 2013-01-18T00:43:08.803 に答える
2

Context.getSystemService() を使用してシステム サービスのインスタンスを取得する場合、サービスのコンストラクターを呼び出しているわけではありません。代わりに、IBinder を使用して実際にサービスのインスタンスを取得し、リモート プロシージャ コールを実行します。そのため、インスタンスを取得するたびに WiFiService.java のコンストラクターが呼び出されるわけではありません。このスレッドのポップアップが表示されているのはどこですか?

于 2013-01-12T17:46:30.210 に答える
1

あなたのアプリケーションが WifiManager にアクセスしている唯一のアプリケーションであることを願っています。WifiManager にアクセスするいくつかのダミー アプリケーションで同時に確認してください。その場合、新しいスレッドを作成しないでください。

于 2013-01-16T21:47:17.083 に答える