繁体   English   中英

使用计时器进行wifi扫描android的意外结果

[英]unexpected result using timer for wifi scan android

我试图每隔1秒安排一次wifi扫描,因为每次扫描结果之间的当前6秒延迟对我来说太长了。 我觉得它有点工作,但我几乎不了解它的工作方式或结果。 这是告诉计时器启动wifiMgr.startScan();的基本代码wifiMgr.startScan(); 每1000毫秒。

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 

任何人都能解释一下吗? - 代码是对的,结果很好。 希望对其背后的逻辑有任何解释。

更新 :这是BroadcastReceiver代码的其余部分。

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

你的sb在你的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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM