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”的线程,但我在多次运行中只得到一个线程。

4

3 回答 3

3

我相信您正在开始/停止中创建一个新的 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 回答