Как я могу перебрать маяки с помощью android-ibeacon-service?

Я использую методы ранжирования маяков, чтобы обнаружить и использовать iBeacons. Однако я столкнулся с проблемой при попытке перебрать все найденные маяки.

Служба маяка возвращает коллекцию, размер которой я могу проверить и посмотреть, есть ли 3 маяка. Однако, что бы я ни пытался, я могу надежно перебирать маяки. Кажется, каждый раз я использую разные маяки, и некоторые из них часто пропускаются.

я пытался while(iBeacons.iterator().hasNext()) и это просто заморозило мое приложение. Я попытался сравнить последний маяк, который я проанализировал, с текущим выбранным маяком и выбросить его, но это не помогло пройти через все маяки.

Я думаю, что поскольку коллекция обновляется асинхронно, и мой анализ занимает гораздо больше времени, чем добавляется второй новый маяк, прежде чем я получаю возможность обработать старые, и мне кажется, что я просто случайным образом обрабатываю один из коллекции каждый раз.

Как я могу получить и разобрать каждый маяк каждый раз?

1 ответ

Решение

Код близок - ему просто нужно построить 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
1
Другие вопросы по тегам