我認爲,您的解決方案是錯誤的。您不需要每隔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。它可以讓你監控與RxJava觀測量的WiFi接入點的變化如下:
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
}
});
該解決方案還使用廣播接收器類似於第一代碼片段引擎蓋下,但它包裹着可觀的,所以使用更簡單。
它工作正常,但我收到重複結果的「突發」。我得到了4〜6次相同的讀數,然後1秒或2秒沒有任何結果,然後再次爆發4〜6次重複結果。 –
這就是它的工作方式。圖書館掃描無線網絡並在準備就緒時收到結果。如果您在站在同一個地方測試應用程序,則應該得到相同的結果,直到出現新的接入點。您可以嘗試用手機移動,例如在街上看到它會得到不同的結果。接收「突發」結果由庫API和Android API規定。我不確定是否可以獲得單個AP,而不是所有可用的AP。 –