неожиданный результат с использованием таймера для сканирования Wi-Fi Android - PullRequest
3 голосов
/ 27 января 2011

Я пытаюсь запланировать сканирование Wi-Fi каждую 1 секунду, так как текущая задержка в 6 секунд между каждым результатом сканирования слишком велика для меня.Я думаю, как-то это работает, но я едва понимаю, как это работает, или результат.Вот базовый код, указывающий таймеру запускать 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();
    }
}

1 Ответ

0 голосов
/ 31 января 2011

Ваш 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");
...