Как я могу перебрать маяки с помощью 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