2016-11-11 159 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。它可以讓你監控與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 
     } 
    }); 

該解決方案還使用廣播接收器類似於第一代碼片段引擎蓋下,但它包裹着可觀的,所以使用更簡單。

+0

它工作正常,但我收到重複結果的「突發」。我得到了4〜6次相同的讀數,然後1秒或2秒沒有任何結果,然後再次爆發4〜6次重複結果。 –

+1

這就是它的工作方式。圖書館掃描無線網絡並在準備就緒時收到結果。如果您在站在同一個地方測試應用程序,則應該得到相同的結果,直到出現新的接入點。您可以嘗試用手機移動,例如在街上看到它會得到不同的結果。接收「突發」結果由庫API和Android API規定。我不確定是否可以獲得單個AP,而不是所有可用的AP。 –