質問

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

役に立ちましたか?

解決

あなたが電話するとき startScan() 実際のスキャンにどれくらいの時間がかかるかわかりません(一般的に言えば、1ミリ秒または5時間になる可能性があります)。したがって、確実に電話することはできません getScanResults() スキャンがいつ完了したかわからないように。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top