2011-06-10 8 views
4

私はwi-fiスキャナを作成しました。それは利用可能なWi-Fiネットワークを絶えずスキャンします。しかし、なぜ私は実際にスキャンを実行することができます(正確にstartScan()タイマーと毎x秒を呼び出す)、ブロードキャスト受信機を作成せずに同じ結果を受信することができる場合、私の質問は、ブロードキャスト受信機を使用しないWi-Fiスキャンですか?

これはonCreate()方法における放送受信機コードである:

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 
      } 
    } 
} 
ある
timer = new Timer(true); 
timer.schedule(new WifiTimerTask(), 0, scanningInterval); 
registerReceiver(receiver, i); 

:スキャンボタンは私が押された後に呼び出される走査方法において

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 
    } 
}; 

そして、スキャンはウィットで実行できるということですhout registerReceiver(receiver,i)。ただし、scanningIntervalが2秒未満の場合にのみ、receiverのスキャン結果とstartScan()は同期しません。それによって、startScan()の結果はreceiverまで変更されず、新しい結果が得られます。一方logCatで私はERROR/wpa_supplicant(5837): Ongoing Scan action...を得る。しかし、2sのように見えるスキャン間隔は最低です。私の前提が間違っていれば私を修正してください。

+0

ブロードキャストレシーバー、インテントフィルターなどのコードを表示してください。このコードにはいくつかの利点があります。 –

答えて

2

startScan()に電話すると、実際のスキャンの所要時間がわかりません(一般的に1ミリ秒または5時間)。したがって、いつスキャンが完了したかわからないので、確実にgetScanResults()に電話をかけることはできません。

getScanResults()が更新スキャン結果を返すときにイベントを追跡するには、SCAN_RESULTS_AVAILABLE_ACTIONに登録する必要があります。

+0

ありがとう!私はあなたの意見を持っています。しかし、私は2秒以上の間隔でstartScan()を使用する場合、それは受信機なしで信頼できることができますか?一定の時間間隔で結果を受け取る際の障害は何ですか?更新された質問を確認してください。 – Artur

+0

まず、Wi-Fiスキャンを開始するためだけに不要なスレッドを作成します。第二に、あなたはその間隔が2秒か5分かどうかを確かめることができません。異なるデバイス、ベンダー、ネットワークドライバ、Wi-Fiレイヤの実装はデバイス間で大幅に異なる可能性があります。ハードコーディングされた間隔は使用しないでください。それはちょうど悪い(アンドロイドでないものの場合でも)、特にあなたが組み込みの代替手段を使い易いときにはそうです。 – inazaruk

+0

ありがとうございます。だからあなたの提案は、タイマースレッドなしで放送受信機を使用していますか?この場合、スキャンは1回だけ実行されます。私は 'startScan()'を起動し、受信メソッドをスキャンメソッドで登録します。 – Artur

関連する問題