各スキャン結果の間の現在の6秒の遅延が長すぎるため、Wi-Fiスキャンを1秒ごとにスケジュールしようとしています。私はどういうわけか、それは動作すると思うが、私はほとんどそれが動作する方法または結果を理解する。 ここには、タイマーにwifiMgr.startScan();
を1000ミリ秒ごとに開始するように伝える基本コードがあります。Wi-Fiスキャンのタイマーを使用して予期しない結果が発生しました。
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秒に表示されています。私が理解できないことは、それぞれの結果について、常に同じ値を持つ2つの行が得られることです。
// 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
誰でもいくつかの光を当てることができます:私は実際にこのように、wifiMgr.startScan()
はタイマーによって、すべての実行で停止されていないため、一部重複結果がなければならないことを期待しますか? - コードは正しいです、結果は良いです。それの背後にある論理についての説明を感謝します。
更新:ここに残りのBroadcastReceiverコードがあります。
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equalsIgnoreCase(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
handleScanResultsAvailable();
}
}
はい、それは1つの結果行に複数のSSIDが表示されますwifiMgr.startScan()の前に 。上記の結果は、テストしたときにSSIDが1つしか検出されなかったため、SSIDが1つしか表示されないことを示しています。以前はタイマーなしで、私はhandleScanResultsAvailableで結果を出力しましたが、タイマーを使用しないかのように通常の出力を表示します。私はここにログ出力を投稿します、http://pastebin.com/zFjfuL7t時間をとってくれてありがとう! – springrolls
1.活動の開始からの最新の結果は、呼び出しを行う前にデータが受信されているように見えるため、活動の開始からの最新の結果です。 2.より多くの放送受信機コードを貼り付けることができますか? 3. onReceiveルーチンはありますか?インテントで渡されるアクションは何ですか? 4。startscanを呼び出してスキャン結果を受け取るまでにどれくらい時間がかかりますか?非常に多くの質問:-) – FrinkTheBrave
はい、これは活動の開始からの結果です。ヌルまたは何も表示しない最初の数行は、まだスキャン結果が利用できない場合です。私はそれが約5秒かかると思います。基本的に、私は 'SCAN_RESULTS_AVAILABLE_ACTION'とTimer([this](http://steve.odyfamily.com/?p=12)のチュートリアルを使用して)のBroadcastReceiverのコードをマージします。ボタンをクリックすると、1秒ごとに 'startScan()'を実行するタイマーが起動します。 – springrolls