2011-06-10 22 views
4

我已經創建了wi-fi掃描儀。它不斷掃描可用的Wi-Fi網絡。但我的問題是,爲什麼如果我實際上可以運行掃描(每隔x秒調用一次計時器startScan())並且在不創建廣播接收機的情況下接收相同的結果,那麼爲什麼還需要廣播接收機?無廣播接收器的Wi-Fi掃描?

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

這在onCreate()方法廣播接收機代碼

而關鍵是掃描可以通過機智hout registerReceiver(receiver,i)。但是,只有當scanningInterval低於2s時,則receiver掃描結果和startScan()不同步。我的意思是startScan()結果不會改變,直到receiver會得到新的結果。同時在logCat中我得到ERROR/wpa_supplicant(5837): Ongoing Scan action...。似乎2s是最低的掃描間隔。如果我的假設錯誤,請糾正我。

+0

向我們展示一段帶有廣播接收器,意圖過濾器等的代碼。可能這個代碼有一些好處。 – 2011-06-10 10:48:44

回答

2

當您撥打startScan()時,您不知道實際掃描需要多長時間(通常可能是1 ms或5個小時)。因此,您不能可靠地撥打getScanResults(),因爲您不知道掃描何時完成。

要跟蹤事件,當getScanResults()將返回更新掃描結果時,您需要訂閱SCAN_RESULTS_AVAILABLE_ACTION

+0

謝謝!我明白了你的觀點。但是,如果我使用startScan()的時間間隔高於2s,它可以在沒有接收器的情況下可靠嗎?以固定的時間間隔接收結果會有什麼障礙?請檢查我更新的問題。 – Artur 2011-06-10 13:29:19

+0

好吧,首先你創建一個不必要的線程來啓動無線掃描。其次,你不能確定這些間隔是2s還是5min。有不同的設備,供應商,網絡驅動程序,Wi-Fi層實現可以在設備之間有很大不同。你不應該使用硬編碼間隔。這很糟糕(即使對於非Android的東西),特別是當你有一個易於使用的內置替代品。 – inazaruk 2011-06-10 13:37:55

+0

謝謝。所以你的建議只是使用沒有定時器線程的廣播接收器?在這種情況下,只執行一次掃描。我啓動'startScan()',然後在掃描方法中註冊接收器。 – Artur 2011-06-10 14:56:48