【问题标题】:Android WifiManager Thread never shuts downAndroid WifiManager 线程永远不会关闭
【发布时间】:2012-12-06 19:45:39
【问题描述】:

执行此行后:

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

【问题讨论】:

  • 我觉得你真正的问题是你有一些上下文问题,所以我不会回答。但是如果你想破解这个问题,你可以通过getting从堆栈中找到你的线程数组,然后通过thread.getName()搜索等于'WifiService',因为ThreadHandler扩展了线程。然后执行this之类的操作。
  • 谁拥有您所看到的线程?它们是否与您的应用程序或系统进程具有相同的用户和进程 ID?您是在特定设备上还是在模拟器中查看此内容? “关闭并重新打开”是否意味着返回/主页并打开,或强制停止该过程?如果是前者,当你做后者时会发生什么?

标签: java android android-wifi


【解决方案1】:

我相信您正在启动/停止的(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 的意思,但没有详细说明我的密集自我。很快就会回来报告。
【解决方案2】:

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

【讨论】:

  • 每次我们执行完整的启动/关闭周期时,我们都会获得一个新的“WifiManager”线程。如果您在调用 getsystemservice 后单步执行设备上的代码,您将立即看到一个新线程启动。我已经仔细研究了源代码和文档,并且(就这些部分而言)我们正在做适当的“清理”。但是我们在每个启动/停止周期都会获得一个新线程,但无法摆脱它们。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2016-10-25
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    相关资源
    最近更新 更多