Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Wifi扫描结果给我奇怪的结果_Java_Android_Timer - Fatal编程技术网

Java Wifi扫描结果给我奇怪的结果

Java Wifi扫描结果给我奇怪的结果,java,android,timer,Java,Android,Timer,我正在尝试保持各种wifi扫描的BSSID和信号强度。然而,我只关心最近的四次扫描。当它扫描四次时效果很好,但是奇怪的事情开始发生,就像每次扫描的大小(结果的数量)在第六次扫描后是一样的。这个代码有什么问题吗?我将结果存储在一个集合列表中(但在处理数据时,我只保留最近的四个集合) 公共类MainActivity扩展活动{ 列表地址=新的ArrayList(); 列出结果; ... @凌驾 创建时的公共void(Bundle savedInstanceState){ //通过使用计时器,代码的整个

我正在尝试保持各种wifi扫描的BSSID和信号强度。然而,我只关心最近的四次扫描。当它扫描四次时效果很好,但是奇怪的事情开始发生,就像每次扫描的大小(结果的数量)在第六次扫描后是一样的。这个代码有什么问题吗?我将结果存储在一个集合列表中(但在处理数据时,我只保留最近的四个集合)

公共类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结果你有一个更大的问题,一个你的手…一个冻结的应用程序和不满的用户。