4

Wi-Fiスキャナーを作成しました。利用可能な Wi-Fi ネットワークを継続的にスキャンします。しかし、私の質問は、実際にスキャンを実行し ( startScan()x 秒ごとにタイマーで呼び出す)、ブロードキャスト レシーバーを作成せずに同じ結果を受け取ることができる場合、正確にブロードキャスト レシーバーが必要になるのはなぜですか?

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 秒が最小のスキャン間隔のようです。私の仮定が間違っている場合は修正してください。

4

1 に答える 1

2

電話をかけるstartScan()と、実際のスキャンにかかる時間はわかりません(通常、1ミリ秒または5時間かかる場合があります)。getScanResults()そのため、スキャンがいつ完了したかわからないため、確実に電話をかけることはできません。

いつgetScanResults()更新スキャン結果が返されるかイベントを追跡するには、サブスクライブする必要がありますSCAN_RESULTS_AVAILABLE_ACTION

于 2011-06-10T10:56:23.710 に答える