2011-01-27 4 views
3

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

Может кто-нибудь пролить некоторый свет? - является правильным кодом, является результатом штрафа. Поблагодарили бы за любое объяснение логики, стоящей за ней.

Обновление: Остальная часть кода BroadcastReceiver.

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

ответ

0

Ваш С.Б. инициализируется за пределами вашей цикл, так что, если результаты содержали более одного результата, он будет производить вывод, как:

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

+0

1. Являются ли эти последние результаты началом работы, поскольку оба они, как представляется, показывают данные, полученные до того, как запрос, требующий его, будет выполнен. 2. Не могли бы вы вставить больше своего кода приемника вещания. 3. Есть ли процедура onReceive? Каково действие, принятое в намерении? 4.Знаете ли вы, сколько времени требуется между вызовом startscan и получением результатов сканирования? Так много вопросов :-) – FrinkTheBrave

+0

Да, это результаты с начала деятельности. Первые несколько строк, показывающие нуль или ничего, - это когда пока нет результатов сканирования. Полагаю, это занимает около 5 секунд. В основном я просто объединяю код между BroadcastReceiver для 'SCAN_RESULTS_AVAILABLE_ACTION' и Timer (используя учебник [this] (http://steve.odyfamily.com/?p=12)). Когда я нажимаю кнопку, он запускает таймер, который запускает 'startScan()' каждые 1 сек. – springrolls

Смежные вопросы