2011-01-27 47 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