java - 连续 WifiManager 扫描获得重复的扫描结果

标签 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();
  }
}

这很好用。但是,当我将计时器设置为以较小的间隔(例如 1 秒)运行时,我得到的结果会以 2 组为一组重复。 有什么解决办法吗?

最佳答案

我认为,你的解决方案是错误的。您不需要每 1 秒或任何其他时间间隔检查一次扫描结果。您应该创建广播接收器。 BroadcastReceiver 在获取扫描结果时会通知您的应用程序。名为 startScan() 的方法不保证结果的传送时间。当您尝试每 1 秒读取一次扫描结果时,它不是确定性的。你可能会收到一些东西,但也可能不会。然而,计时器仍在运行,这会降低性能并耗尽电池,因此该解决方案效率不高。

这里是展示这个想法的示例代码 fragment :

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,类似于第一个代码 fragment ,但它是用 observable 封装的,因此使用更简单。

关于java - 连续 WifiManager 扫描获得重复的扫描结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40555617/

相关文章:

java - Tomcat 不呈现 jsp 页面

java - 无法检索单选按钮的状态

Android生命周期——为什么不能在onPause(){ }中调用onResume()?

java - 动态添加项目到ListView

Java 8 DateTime API 在模式和值都未知时解析日期字符串

Android Studio 无法解析常见的符号

android - “market://details?id =”表示找不到商品

java - 如何在 Android 中一次又一次地从 wifi 列表中选择相同的 wifi 运营商?

Android Wi-Fi Direct 在连接前发送数据

java - 如何以编程方式忘记android中的无线网络?