代码很接近——它只需要Iterator
像这样在单独的行上构造一个:
Iterator<IBeacon> iterator = iBeacons.iterator();
while (iterator.hasNext())
您冻结的原因与库的异步更新无关。(传递给测距回调的 iBeacons 列表是上次扫描周期中看到的那些列表的副本,并且永远不会更改。)问题与该iterator()
方法在 Java 中的工作方式有关。
在上面的代码中,循环内每次都while(iBeacons.iterator().hasNext())
创建一个新副本,并且该迭代器始终指向 iBeacons 集合中的第一个元素。Iterator
因此,如果在循环开始时该集合中至少有一项,它将永远不会结束,并且代码将冻结。
您可以通过以下示例演示这一点:
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
1