Java Wifi扫描结果给我奇怪的结果
我正在尝试保持各种wifi扫描的BSSID和信号强度。然而,我只关心最近的四次扫描。当它扫描四次时效果很好,但是奇怪的事情开始发生,就像每次扫描的大小(结果的数量)在第六次扫描后是一样的。这个代码有什么问题吗?我将结果存储在一个集合列表中(但在处理数据时,我只保留最近的四个集合)Java Wifi扫描结果给我奇怪的结果,java,android,timer,Java,Android,Timer,我正在尝试保持各种wifi扫描的BSSID和信号强度。然而,我只关心最近的四次扫描。当它扫描四次时效果很好,但是奇怪的事情开始发生,就像每次扫描的大小(结果的数量)在第六次扫描后是一样的。这个代码有什么问题吗?我将结果存储在一个集合列表中(但在处理数据时,我只保留最近的四个集合) 公共类MainActivity扩展活动{ 列表地址=新的ArrayList(); 列出结果; ... @凌驾 创建时的公共void(Bundle savedInstanceState){ //通过使用计时器,代码的整个
公共类MainActivity扩展活动{
列表地址=新的ArrayList();
列出结果;
...
@凌驾
创建时的公共void(Bundle savedInstanceState){
//通过使用计时器,代码的整个部分每10秒运行一次
mainWifi.startScan();
结果=mainWifi.getScanResults();
int entry=addresses.size();
如果(entry==4){//已经有4个地址
地址。删除(0);//删除
//老的
//设置
条目=3;
}
address.add(条目,newhashset());
对于(int i=0;i
已更新
我建议等待完成后广播的意图来存储您最新的Wifi列表
我还建议使用for each循环并创建对最新列表的引用,而不是使用get()。在活动中:
List<List<Pair<String, Integer>>> addresses = new ArrayList<List<Pair<String, Integer>>>();
List<Pair<String, Integer>> list;
...
public void newWifiResults() {
list = new ArrayList<Pair<String, Integer>>();
if(addresses.size() > 3) {
addresses.remove(0);
results = mainWifi.getScanResults();
for(ScanResult result : results)
list.add(new Pair<String, Integer>(result.BSSID, result.level));
addresses.add(list);
// call mainWifi.startScan() again after a delay
}
private WifiReceiver wifiReceiver = new WifiReceiver();
如果将其作为嵌套/子类放入活动中,onReceive()将很容易调用newWifiActivity()
最后,您需要在活动中创建对接收者的引用:
List<List<Pair<String, Integer>>> addresses = new ArrayList<List<Pair<String, Integer>>>();
List<Pair<String, Integer>> list;
...
public void newWifiResults() {
list = new ArrayList<Pair<String, Integer>>();
if(addresses.size() > 3) {
addresses.remove(0);
results = mainWifi.getScanResults();
for(ScanResult result : results)
list.add(new Pair<String, Integer>(result.BSSID, result.level));
addresses.add(list);
// call mainWifi.startScan() again after a delay
}
private WifiReceiver wifiReceiver = new WifiReceiver();
在onCreate()或onResume()中,注册接收者:
registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
unregisterReceiver(wifiReceiver);
并在匹配方法(onDestroy()或onPause())中注销接收器:
registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
unregisterReceiver(wifiReceiver);
这更复杂,但您的代码只有在从startScan()返回新结果集时才会运行。当我处理其中一些扫描结果时,我希望它不再捕获稍后的扫描结果,因为我不希望它影响我的数据。如果是这样,我是否仍使用onCreate()或onResume()或者我可以使用我自己的方法。例如,当我处理时,我可以取消注册,当我处理完后再重新注册。另外,如果我使用计时器每10秒扫描一次,我会得到以前的结果吗?例如,我我现在正在扫描,但是一分钟前刚刚完成的一个结果,它会捕获那些还是只捕获我最近一次扫描之后的结果(忽略以前计划的扫描的结果)“我会得到以前的结果吗?”一个快速测试告诉我,在startScan()完成之前,所有连续调用都会被忽略。如果我理解您的问题,“我希望它不再捕获以后的扫描结果”:您不希望新结果更改当前正在处理的结果。这不应该是一个问题,因为您每10秒扫描一次,并且(在我的设备上)扫描在不到一秒钟的时间内返回结果。但你可以确保这不会发生,只需在前一个扫描返回并被处理后调用新的扫描即可。事实上,情况正好相反。如果获得结果所需的时间超过,比如说5秒,我希望忽略这些结果。基本上,如果我错过了一些结果,这是可以的,但是如果我开始扫描,我希望从最新扫描中获得结果。如果旧结果完成得太晚,请忽略这些扫描。我不确定是否有什么需要担心的…我不相信有什么方法可以取消慢速扫描,但当扫描完成时,您将有可能获得最新的结果。如果需要10秒以上的时间来处理re结果你有一个更大的问题,一个你的手…一个冻结的应用程序和不满的用户。