连续WifiManager扫描重复扫描结果

时间:2016-11-11 20:21:57

标签: java android android-wifi wifimanager

我在计时器中有这个:

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

这很好用。但是,当我将Timer设置为以小间隔(例如1秒)运行时,我得到的结果将以2为一组重复。 对此有任何解决方法吗?

1 个答案:

答案 0 :(得分:1)

我认为,你的解决方案是错误的。您不需要每1秒或任何其他间隔检查扫描结果。您应该创建BroadcastReceiver。 BroadcastReceiver会在获得扫描结果时通知您的应用。名为startScan()的方法不保证结果的交付时间。当您尝试每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);

您可以根据需要调整此代码段。

如果您愿意,还可以使用ReactiveWiFi处提供的名为https://github.com/pwittchen/ReactiveWiFi的库。它允许您使用RxJava Observables监视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,因此使用更简单。