Android的WifiManager线程永远不会关闭

5
执行了这行代码后:
WifiManager man = ((WifiManager) ctx.getSystemService(Context.WIFI_SERVICE));

会出现一个标记为“WifiManager”的线程。在WifiService.java的第203行的Java源文件中:

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

问题是,每次我们的应用程序关闭并重新打开时,它都会创建一个新线程,运行5次,就会有5个线程。不确定是否有任何方法可以停止它?
编辑
更改为getApplicationContext以确保访问的上下文是一致的,并且一切正常。我仍然得到一个标记为“WifiService”的线程,但在多次运行中只有一个线程。

1
我觉得你真正的问题是上下文不清,所以我不能回答。但如果你想通过黑科技解决这个问题,你可以通过从堆栈中获取线程数组来找到你的线程,然后搜索 thread.getName() 等于 'WifiService',因为 ThreadHandler 扩展了 Thread。然后像这样做一些事情。 - shibbybird
1
你看到的线程是由谁拥有的?它们是否具有与您的应用程序或系统进程相同的用户和进程ID?您是在特定设备上查看还是在模拟器中查看?“关闭并重新打开”是指返回/主页并打开,还是强制停止进程?如果是前者,那么当您执行后者时会发生什么? - devunwired
1
看起来像是一个缺陷:http://code.google.com/p/android/issues/detail?id=43006 - user1159819
3个回答

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”相同的上下文,您不会遇到此问题。但我不确定这是否是解决问题的正确方法,如果线程存在较大问题,则可能值得一试。

我感觉在此之前应该读过那个......我正在尝试。我相信这就是ShibbyBird想表达的,但他没有详细说明让我这个笨蛋理解。很快会回报结果。 - accordionfolder

2

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


每次进行完整的启动/关闭循环时,我们都会得到一个新的“ WifiManager”线程。如果在调用getsystemservice后,在设备上逐步执行代码,您将立即看到启动了一个新的线程。我已经深入挖掘了源代码和文档,并且(就这些部分而言)我们正在进行正确的“清理”。但是,我们每次启动/停止周期都会获得一个新的线程,没有办法摆脱它们。 - accordionfolder

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接