Android WifiManager线程永远不会关闭

时间:2012-12-06 19:45:40

标签: java android android-wifi

执行此行后:

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以确保它访问的上下文是一致的,一切都很顺利。我仍然得到一个标记为“WifiService”的线程,但我只能在多次运行中获得一个线程。

3 个答案:

答案 0 :(得分: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这样的相同上下文,你就不会遇到这个问题。我不确定这是否是解决这个问题的正确方法,但如果让线程围绕一个更大的问题,那么它可能值得。

答案 1 :(得分:2)

使用Context.getSystemService()获取系统服务的实例时,不会调用服务的构造函数。相反,您实际上是使用IBinder获取服务的实例,以便对其进行远程过程调用。因此,每次获得它的实例时,都不会调用WiFiService.java的构造函数。你到底在哪里看到这个帖子弹出来了?

答案 2 :(得分:1)

我希望您的应用程序是访问WifiManager的唯一应用程序。请同时检查一些访问WifiManager的虚拟应用程序;在这种情况下,它不应该创建一个新的线程。