我有几个侦听器正在从ONVIF设备搜索中返回值。
我有找到ONVIF设备(IP地址)的代码,然后为每个设备执行for循环以遍历设备列表。对于每个设备,我都会为该设备创建一个侦听器以检索媒体URL流。 (因此,如果有两个ONVIF摄像机,我需要查看每个摄像机的流URL是什么)
由于多线程,我经常同时从这些侦听器接收返回值(在这种情况下,是媒体URL信息)
我需要能够使用这些值更新单个ArrayList,并知道所有设备何时都从我实例化的侦听器返回了值。
我是否有办法为此使用同步类型?
我查阅了一些有关使侦听器“线程安全”的教程,但找不到任何人可以创建多个相同的侦听器来跟踪结果。
这里是代码。一旦触发了侦听器,就会调用“ appendResultsText”函数。 uri字符串是我需要附加到数组中的值(我这样做但不可靠)
awk '{print $1} ' /var/log/httpd/access_log | sort -u | xargs whois -l | awk '/country/{print $2}'
在https://github.com/RootSoft/ONVIF-Java向RootSoft大喊大叫的真棒ONVIF发现库!
请注意,它作为IntentService运行,因此它位于UI线程之外。
答案 0 :(得分:0)
我需要能够使用这些值更新单个ArrayList
由于突变可能比遍历更多,因此请使用synchronized List<T>
。
final List<T> list = Collections.synchronizedList(new ArrayList<T>());
或者,如果您的列表无法同步,则可能需要使用临时ArrayBlockingQueue<T>
来将结果排队,然后在所有设备都返回其值之后drainTo
ArrayList<T>