我正在使用信标测距方法来发现和使用iBeacons。但是,我在试图遍历所有找到的信标时遇到了问题。
信标服务返回一个集合,我可以检查它的大小,并看到有3个信标。但是,不管我尝试什么,我都可以可靠地遍历信标。我似乎每次都会按不同的随机顺序去,有些信标经常被跳过。
我试过了while(iBeacons.iterator().hasNext()),这只是冻结了我的应用程序。我试着把我分析过的lastBeacon与当前选择的信标进行比较,并将其扔掉,但这并不能通过所有的信标。
我认为,由于集合是异步更新的,而且我的解析所用的时间远远长于添加了第二个新信标之后,我才有机会处理旧的信标,而且每次我似乎只是随机地从集合中处理一个。
我如何每次都能得到和解析每个信标?
发布于 2014-02-10 05:08:49
代码是封闭的--它只需要在单独的行上构造一个Iterator,如下所示:
Iterator<IBeacon> iterator = iBeacons.iterator();
while (iterator.hasNext()) 冻结的原因与库的异步更新无关。(传递给测距回调的iBeacons列表是上一次扫描周期中看到的内容的副本,从未更改。)这个问题与iterator()方法在Java中的工作方式有关。
在上面的代码中,while(iBeacons.iterator().hasNext())每次在循环中创建一个新的Iterator副本,迭代器总是指向iBeacons集合中的第一个元素。因此,如果在循环开始时集合中至少有一个项,它就永远不会完成,并且代码将冻结。
您可以通过以下示例演示这一点:
public class IteratorTest{
public static void main(String []args){
java.util.Collection iBeacons = java.util.Arrays.asList("1", "2", "3");
System.out.println("This loop will not freeze");
java.util.Iterator iterator = iBeacons.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println("This loop will freeze");
while(iBeacons.iterator().hasNext()) {
System.out.println(iBeacons.iterator().next());
}
// We will never get to here
}
}它产生以下输出(永不结束):
This loop will not freeze
1
2
3
This loop will freeze
1
1
1
1
1
1
1
1
1
1
1
1
1https://stackoverflow.com/questions/21668978
复制相似问题