[android]连续 WifiManager 扫描得到重复扫描结果

发布时间: 2017/3/19 14:10:42
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有这里面一个计时器︰

if (wManager.startScan()) {
  try {
    //Following method is one I call to process the results
    acquireCurrentZoneFromServer.run(client, wManager.getScanResults());
  } catch (Exception e) {
    e.printStackTrace();
  }
}

这工作正常。然而,当我设置计时器来运行小的间隔,如 1 秒,我所得到的结果重复了 2 组。 对此的任何变通方法吗?

解决方法 1:

我认为,您的解决方案是错误的。你不需要的扫描结果检查每个 1 的第二次或任何其他时间间隔。您应该创建 BroadcastReceiverBroadcastReceiver 将通知您的应用程序,当它获取扫描结果。方法命名为 startScan() 并不能保证 time 的交付成果。当您尝试读取扫描结果每隔 1 秒时,它不是决定性的。您可能会收到一些东西,但你也不可能。然而,计时器会,什么会降低性能,并耗尽电池,所以此解决方案并不能有效。

这里是提出这个想法的典型的代码片段︰

final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifiManager.startScan(); // without starting scan, we may never receive any scan results

final IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.RSSI_CHANGED_ACTION); // you can keep this filter if you want to get fresh results when singnal stregth of the APs was changed
filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);

wifiManager.startScan();

final BroadcastReceiver receiver = new BroadcastReceiver() {
  @Override public void onReceive(Context context, Intent intent) {
    wifiManager.startScan(); // start scan again to get fresh results ASAP
    wifiManager.getScanResults();
  }
};

context.registerReceiver(receiver, filter);

// don't forget to unregister receiver when appropriate
// context.unregisterReceiver(receiver);

您的需求,您可以调整该片段。

如果你想,你还可以使用我在https://github.com/pwittchen/ReactiveWiFiReactiveWiFi可用的库。它允许您监视与 RxJava 观测的 WiFi 接入点更改,如下所示︰

new ReactiveWifi().observeWifiAccessPoints(context)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Action1<List<ScanResult>>() {
      @Override public void call(List<ScanResult> scanResults) {
        // do something with scanResults
      }
    });

此解决方案还使用 BroadcastReceiver 引擎盖类似于第一个代码片段中,但它包裹着 observable ,所以使用更简单。

赞助商