gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:23:33 27 4
gpt4 key购买 nike

我正在尝试每 1 秒安排一次 wifi 扫描,因为当前每次扫描结果之间的 6 秒延迟对我来说太长了。我认为它以某种方式起作用,但我几乎不了解它的工作方式或结果。下面是告诉计时器每 1000 毫秒启动一次 wifiMgr.startScan(); 的基本代码。

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

这是结果的一个 fragment :

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");

关于android - 使用计时器进行 wifi 扫描 android 的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4815783/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com