Android-синхронизирующие прослушиватели для возвращаемого значения для устройств ONVIF - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть несколько прослушивателей, которые возвращают значения из поиска устройства ONVIF.

У меня есть код, который находит устройства ONVIF (IP-адреса), а затем выполняет цикл for для каждого устройства, чтобы перебрать список устройств.,Для каждого устройства я создаю прослушиватель для устройства, чтобы получить поток медиа-URL.(поэтому, если есть две камеры ONVIF, мне нужно посмотреть, какой URL у каждой камеры)

Из-за многопоточности я часто получаю возвращаемые значения от этих слушателей одновременно (в этом случаеинформация URL-адреса мультимедиа)

Мне нужно иметь возможность обновить один ArrayList с этими значениями и знать, когда все устройства вернули значения из прослушивателей, которые я создал.

Я запутался, еслиЕсть ли способ использовать синхронизированный тип для этого?

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

Вот код.«AppendResultsText» - функция, вызываемая после запуска слушателя.Строка uri - это значение, которое мне нужно добавить в массив (что я и делаю, но не надежно)

onvifManager.getMediaProfiles(device1, new OnvifMediaProfilesListener() {
      @Override
      public void onMediaProfilesReceived(@Nonnullbe.teletask.onvif.models.OnvifDevice device,
                                                            @Nonnull List<OnvifMediaProfile> mediaProfiles) {

      onvifManager.getMediaStreams(device, mediaProfiles.get(0), new OnvifMediaStreamURIListener() {
           @Override
           public void onMediaStreamURIReceived(@Nonnull be.teletask.onvif.models.OnvifDevice device,
                                                                     @Nonnull OnvifMediaProfile profile, @Nonnull String uri) {

                appendResultsText(uri, nThisDeviceTrack, nDeviceTotal, lShowNotifications_x, lVxgViewRefresh_x );


           }
      });
    }
 });

Привет RootSoft на https://github.com/RootSoft/ONVIF-Java для потрясающей библиотеки обнаружения ONVIF!

В качестве примечания, он работает как IntentService, поэтому он находится за пределами потоков пользовательского интерфейса.

1 Ответ

0 голосов
/ 16 февраля 2019

Мне нужно иметь возможность обновить один ArrayList с этими значениями

Поскольку мутации могут быть больше, чем обходы, используйте synchronized List<T>.

final List<T> list = Collections.synchronizedList(new ArrayList<T>());
* 1008.* В качестве альтернативы, если ваш список не может быть синхронизирован, вы можете использовать временный ArrayBlockingQueue<T> для постановки в очередь ваших результатов, а затем drainTo ваш ArrayList<T> после того, как все устройства вернут свои значения.
...