Я думаю, ваше решение неверно. Вам не нужно проверять результаты сканирования каждые 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 под капотом аналогичен первому фрагмент кода, но это обернуто с наблюдаемым, и поэтому использование проще.
Работает хорошо, но я получаю «всплески» повторных результатов. Я получаю 4 ~ 6 раз одно и то же чтение, затем ничего за 1 или 2 секунды, затем еще один всплеск 4 ~ 6 повторных результатов. –
Так оно и работает. Библиотека сканирует беспроводные сети и получает результаты, когда они готовы. Если вы тестируете приложение, находясь в том же месте, вы должны получить те же результаты, пока не появится новая точка доступа. Вы можете попытаться перемещаться с помощью телефона, например. вокруг улицы, чтобы увидеть, что у нее разные результаты. Получение «всплеска» результатов продиктовано библиотечным API и API Android. Я не уверен, что мы можем получить единую точку доступа, поскольку она появляется вместо всех доступных точек доступа. –