执行此行后:
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”的线程,但我只能在多次运行中获得一个线程。
答案 0 :(得分:3)
我相信您正在开始/停止的(Context) Activity
中创建一个新的WifiManager。
注意:通过此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的虚拟应用程序;在这种情况下,它不应该创建一个新的线程。