不需要广播接收器的Wi-Fi扫描?

4

我已经创建了Wi-Fi扫描器。它会不断地扫描可用的Wi-Fi网络。但我的问题是,如果我可以通过定时器每x秒运行扫描(调用startScan()),并获得相同的结果,那么为什么需要广播接收器呢?

以下是在onCreate()方法中的广播接收器代码:

i = new IntentFilter();
i.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
receiver = new BroadcastReceiver(){
    public void onReceive(Context c, Intent i){
      WifiManager w = (WifiManager) c.getSystemService(Context.WIFI_SERVICE);
      List<ScanResult> l = w.getScanResults();
      for (ScanResult r : l) {
         // do smth with results
      }
      // log results
    }
};

在扫描方法中,即在按下扫描按钮后调用的方法中,我有:

timer = new Timer(true);
timer.schedule(new WifiTimerTask(), 0, scanningInterval);
registerReceiver(receiver, i );

其中WifiTimerTask是什么

publlic class WifiTimerTask extends TimerTask{
    @Override
     public void run(){
         wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
         if (wifi.isWifiEnabled()) {
            wifi.startScan();
            List<ScanResult> sc = wifi.getScanResults(); 
            for (ScanResult r : l) {
               // do smth with results
            }
           // log results
          }
     }
}

而且重点是扫描可以在不使用registerReceiver(receiver,i)的情况下进行。但是只有当scanningInterval小于2秒时,receiver扫描结果和startScan()没有同步。我的意思是startScan()结果在receiver获取新结果之前不会改变。同时,在logCat中我得到了ERROR/wpa_supplicant(5837): Ongoing Scan action...。似乎2秒是最低的扫描间隔。如果我的假设有误,请纠正我。

请向我们展示一个包含广播接收器、意图过滤器等内容的代码片段。也许这个代码有一些好处。 - Plamen Nikolov
1个回答

2
当您调用startScan()时,您不知道实际扫描需要多长时间(一般来说可能是1毫秒或5小时),因此您无法可靠地调用getScanResults(),因为您不知道何时完成扫描。
要跟踪事件以便在getScanResults()返回更新的扫描结果时进行订阅,您需要订阅SCAN_RESULTS_AVAILABLE_ACTION

谢谢!我明白你的意思。但是,如果我使用高于2秒的间隔来使用startScan(),在没有接收器的情况下它是否可靠?有什么障碍会导致无法按固定时间间隔接收结果?请查看我的更新问题。 - Artur
首先,你创建了一个不必要的线程来启动WiFi扫描。其次,你无法确定这些间隔是2秒还是5分钟。不同的设备、供应商、网络驱动程序以及Wi-Fi层实现在设备之间可能会有很大差异。你不应该使用硬编码的间隔。这样做很糟糕(即使对于非Android事物也是如此),尤其是当你有一个易于使用的内置替代方案时。 - inazaruk
谢谢。所以你的建议是只使用广播接收器而不使用计时器线程?在这种情况下,只执行一次扫描。我调用startScan(),然后在扫描方法中注册接收器。 - Artur
使用SCAN_RESULTS_AVAILABLE_ACTION只会在按下按钮后返回一个结果。但是,使用RSSI_CHANGED_ACTION我可以定时返回更新。 - Artur
你可以始终使用SCAN_RESULTS_AVAILABLE_ACTION,并在广播接收器的末尾调用startScan,这样你就有了一个循环。 - LDomagala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接