2016-11-11 11 views
0

Я это внутри Таймер:Последовательные сканирование WifiManager получение повторен Результаты сканирования

if (wManager.startScan()) { 
    try { 
    //Following method is one I call to process the results 
    acquireCurrentZoneFromServer.run(client, wManager.getScanResults()); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
} 

Это прекрасно работает. Однако, когда я устанавливаю Таймер на небольшой промежуток времени, например, 1 секунду, результаты, которые я получаю, повторяются в группах по 2. Любое обходное решение по этому вопросу?

ответ

1

Я думаю, ваше решение неверно. Вам не нужно проверять результаты сканирования каждые 1 секунду или любой другой интервал. Вы должны создать BroadcastReceiver. BroadcastReceiver уведомит ваше приложение, когда оно получит результаты сканирования. Метод с именем startScan() не гарантирует время доставки результатов. Когда вы пытаетесь читать результаты сканирования каждые 1 секунду, это не детерминировано. Вы можете получить что-то, но вы также можете этого не сделать. Тем не менее, таймер идет, что снижает производительность и истощает батарею, поэтому это решение не так эффективно.

Вот примерный фрагмент кода представления идеи:

final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
wifiManager.startScan(); // without starting scan, we may never receive any scan results 

final IntentFilter filter = new IntentFilter(); 
filter.addAction(WifiManager.RSSI_CHANGED_ACTION); // you can keep this filter if you want to get fresh results when singnal stregth of the APs was changed 
filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 

wifiManager.startScan(); 

final BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override public void onReceive(Context context, Intent intent) { 
    wifiManager.startScan(); // start scan again to get fresh results ASAP 
    wifiManager.getScanResults(); 
    } 
}; 

context.registerReceiver(receiver, filter); 

// don't forget to unregister receiver when appropriate 
// context.unregisterReceiver(receiver); 

Вы можете настроить этот фрагмент кода для ваших нужд.

Если вы хотите, вы также можете использовать мою библиотеку под названием ReactiveWiFi, доступную по адресу https://github.com/pwittchen/ReactiveWiFi. Это позволяет отслеживать изменения точек доступа Wi-Fi с RxJava наблюдаемого следующим образом:

new ReactiveWifi().observeWifiAccessPoints(context) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(new Action1<List<ScanResult>>() { 
     @Override public void call(List<ScanResult> scanResults) { 
     // do something with scanResults 
     } 
    }); 

Это решение также использует BroadcastReceiver под капотом аналогичен первому фрагмент кода, но это обернуто с наблюдаемым, и поэтому использование проще.

+0

Работает хорошо, но я получаю «всплески» повторных результатов. Я получаю 4 ~ 6 раз одно и то же чтение, затем ничего за 1 или 2 секунды, затем еще один всплеск 4 ~ 6 повторных результатов. –

+1

Так оно и работает. Библиотека сканирует беспроводные сети и получает результаты, когда они готовы. Если вы тестируете приложение, находясь в том же месте, вы должны получить те же результаты, пока не появится новая точка доступа. Вы можете попытаться перемещаться с помощью телефона, например. вокруг улицы, чтобы увидеть, что у нее разные результаты. Получение «всплеска» результатов продиктовано библиотечным API и API Android. Я не уверен, что мы можем получить единую точку доступа, поскольку она появляется вместо всех доступных точек доступа. –

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

  • Нет связанных вопросов^_^