Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android WifiManager线程永远不会关闭_Java_Android_Android Wifi - Fatal编程技术网

Java Android WifiManager线程永远不会关闭

Java Android WifiManager线程永远不会关闭,java,android,android-wifi,Java,Android,Android Wifi,执行此行后: WifiManager man = ((WifiManager) ctx.getSystemService(Context.WIFI_SERVICE)); 将显示一个标记为“WifiManager”的线程。在Java源文件中: 问题是,每次关闭并重新打开我们的应用程序时,它都会创建一个新线程,运行5次,您就有5个线程。不确定是否有办法阻止它 编辑 更改为getApplicationContext,以确保其访问的上下文一致且一切正常。我仍然得到一个标记为“WifiService”的

执行此行后:

WifiManager man = ((WifiManager) ctx.getSystemService(Context.WIFI_SERVICE));
将显示一个标记为“WifiManager”的线程。在Java源文件中:

问题是,每次关闭并重新打开我们的应用程序时,它都会创建一个新线程,运行5次,您就有5个线程。不确定是否有办法阻止它

编辑


更改为getApplicationContext,以确保其访问的上下文一致且一切正常。我仍然得到一个标记为“WifiService”的线程,但我在多次运行中只得到一个线程。

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

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

我相信您正在启动/停止的
(上下文)活动中创建一个新的WifiManager

来自

注意:通过此API获得的系统服务可能与从…获得它们的上下文密切相关

也来自和


它使用映射来缓存系统服务,因此我相信如果您使用与
应用程序
相同的上下文,您不会遇到这个问题。我不确定这是否是解决这个问题的正确方法,但是,如果有线程围绕着一个更大的问题为您服务,这可能值得一段时间。

我觉得您真正的问题是您有一些上下文问题,所以我不会回答。但是,如果您想破解这个问题,您可以通过堆栈中的线程数组,然后通过线程搜索来找到线程。getName()等于“WifiService”,因为ThreadHandler扩展了线程。然后像这样做。谁拥有你看到的线程?它们是否与您的应用程序或系统进程具有相同的用户和进程id?您是在特定设备上还是在仿真器中查看这一点?“关闭并重新打开”是指返回/回家并打开,还是强制停止该过程?如果是前者,当您执行后者时会发生什么?看起来像是一个缺陷:每次我们执行完整的启动/关闭周期时,都会得到一个新的“WifiManager”线程。如果在调用getsystemservice后单步执行设备上的代码,您将立即看到一个新线程启动。我已经翻遍了源代码和文档,并且(就这些部分而言)我们正在进行适当的“清理”。但是我们在每个启动/停止周期中都会得到一个新线程,没有办法摆脱它们。我觉得不知怎么的,我以前应该读过这些。。。。我现在正在试。我相信这就是狗屎鸟想要表达的意思,但并没有详细说明我的致密自我。我很快就回来报到。
 HandlerThread wifiThread = new HandlerThread("WifiService");
 wifiThread.start();
 mWifiHandler = new WifiHandler(wifiThread.getLooper());
@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;
}
...