0

我正在使用信标测距方法来发现和使用 iBeacon。但是,我在尝试遍历找到的所有信标时遇到了问题。

信标服务返回一个集合,我可以检查它的大小并看到有 3 个信标。但是,无论我尝试什么,我都可以可靠地遍历信标。我似乎每次都以不同的随机信标顺序进行,有些经常被跳过。

我已经尝试过while(iBeacons.iterator().hasNext())了,这只是冻结了我的应用程序。我尝试将我解析的 lastBeacon 与当前选择的信标进行比较并将其丢弃,但这并不能通过所有信标。

我认为,由于集合是异步更新的,而且在我有机会处理旧信标之前,我的解析花费的时间比添加第二个新信标的时间要长得多,而且我似乎每次只是随机处理集合中的一个。

如何每次获取和解析每个信标?

4

1 回答 1

2

代码很接近——它只需要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
于 2014-02-10T05:08:49.793 回答