2016-11-11 133 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。 –