首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何使用android-ibeacon服务来迭代信标呢?

我如何使用android-ibeacon服务来迭代信标呢?
EN

Stack Overflow用户
提问于 2014-02-10 04:15:54
回答 1查看 689关注 0票数 0

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

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

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

我认为,由于集合是异步更新的,而且我的解析所用的时间远远长于添加了第二个新信标之后,我才有机会处理旧的信标,而且每次我似乎只是随机地从集合中处理一个。

我如何每次都能得到和解析每个信标?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-10 05:08:49

代码是封闭的--它只需要在单独的行上构造一个Iterator,如下所示:

代码语言:javascript
复制
    Iterator<IBeacon> iterator = iBeacons.iterator();
    while (iterator.hasNext()) 

冻结的原因与库的异步更新无关。(传递给测距回调的iBeacons列表是上一次扫描周期中看到的内容的副本,从未更改。)这个问题与iterator()方法在Java中的工作方式有关。

在上面的代码中,while(iBeacons.iterator().hasNext())每次在循环中创建一个新的Iterator副本,迭代器总是指向iBeacons集合中的第一个元素。因此,如果在循环开始时集合中至少有一个项,它就永远不会完成,并且代码将冻结。

您可以通过以下示例演示这一点:

代码语言:javascript
复制
    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
         }

    }

它产生以下输出(永不结束):

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21668978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档