2011-01-27 61 views
3

我想安排一個無線掃描每1秒,因爲每個掃描結果之間的當前6秒延遲對我來說太長。我認爲它有效,但我幾乎不瞭解它的工作方式或結果。 這裏是告訴定時器每1000毫秒開始wifiMgr.startScan();的基本代碼。使用無線掃描定時器的意外結果android

private void startNetworkScan() { 
    mTimer = new Timer(); 
    mTimer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      TimerMethod(); 
     } 
    }, 0, 1000); 
} 

private void TimerMethod() { 
    this.runOnUiThread(rTimer); 
} 

private Runnable rTimer = new Runnable() { 
    public void run() { 
     wifiMgr.startScan(); 
     Bundle bb = wifiScanReceiver.getResultExtras(true); 
     txtList.append("Result " + bb.getString("scanresult") + "\n"); 
    } 
}; 

下面是BroadcastReceiver類的代碼。我只是顯示來自接入點的時間戳和相關信息。

private void handleScanResultsAvailable() { 
    List<ScanResult> results = wifiMgr.getScanResults(); 

    String currentTimeStr = new SimpleDateFormat("HH:mm:ss").format(new Date()); 
    Bundle b = new Bundle(); 
    StringBuilder sb = new StringBuilder(); 
    sb.append(i + ": " + currentTimeStr); 
    for (ScanResult result : results) { 
     sb.append(String.format(" SSID: %s, RSSI: %s dBm ", result.SSID, result.level)); 
    } 
    b.putString("scanresult", sb.toString()); 
    setResultExtras(b); 
    i++; 
} 

這裏是結果的一個片段:

Result 1: 10:04:12 SSID: XXXXX, RSSI: -88 dBm 
Result 1: 10:04:12 SSID: XXXXX, RSSI: -88 dBm 
Result 2: 10:04:14 SSID: XXXXX, RSSI: -87 dBm 
Result 2: 10:04:14 SSID: XXXXX, RSSI: -87 dBm 

晴每個結果顯示每1-2秒,這是相當不錯的。我不明白的是,對於每個結果,我總是會得到兩條具有相同值的行。其實,我想到的是應該有一些重疊的結果,因爲wifiMgr.startScan()不是由定時器在每一個執行停止,就像這樣:

// there are ca. 6-7 lines for every record 
// as the wifi scanresult delay is 6 secs 
Result 1: 10:03:40 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:41 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:42 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:43 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:44 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:45 SSID: XXXXX, RSSI: -85 dBm 
Result 2: 10:03:45 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:46 SSID: XXXXX, RSSI: -85 dBm 
Result 2: 10:03:46 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:47 SSID: XXXXX, RSSI: -85 dBm 
Result 2: 10:03:47 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:48 SSID: XXXXX, RSSI: -85 dBm 
Result 2: 10:03:48 SSID: XXXXX, RSSI: -85 dBm 

任何人都可以提供一些線索? - 代碼正確,結果不錯。希望對其背後的邏輯有任何解釋。

更新:這裏是廣播接收器的其餘代碼。

@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equalsIgnoreCase(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { 
     handleScanResultsAvailable(); 
    } 
} 

回答

0

你的某人是你的外初始化for循環,因此,如果結果包含不止一個結果,它會產生這樣的輸出:

Result 1: 10:04:12 SSID: XXXXX, RSSI: -88 dBm SSID: XXXXX, RSSI: -85 dBm 

因此重複的行輸出可能是在代碼輸出結果。

在你rTimer運行代碼,調用wifiMgr.startScan()開始掃描,但將立即返回,因此下一行不會得到你所期望的數據。

想必您的接收器接收android.net.wifi.SCAN_RESULTS。它應該檢查並輸出結果。

基本上,您的數據請求和數據返回不同步。你問的數據,但嘗試顯示它返回

前,你可以把一些伐木,看看發生了什麼? 之前wifiMgr.startScan():

/*DEBUG*/Log.d(this.getClass().getName(), "run: Started"); 

,並在handleScanResultsAvailable開始:

/*DEBUG*/Log.d(this.getClass().getName(), "handleScanResultsAvailable: Started"); 
+0

是的,它會顯示更多比一個結果行一個SSID。我上面附加的結果只顯示了一個SSID,因爲當我測試它時,應用程序只檢測到一個SSID。以前沒有定時器,我在handleScanResultsAvailable中輸出結果,但它顯示正常的輸出,就像我沒有使用定時器一樣。我在這裏發佈日誌輸出,http://pastebin.com/zFjfuL7t感謝您花時間! – springrolls 2011-02-01 09:01:41