Во-первых, обратите внимание, что следующие относится к Прилепляйся 2.0.1, но я думаю, что логика та же.
В Cling существует различие между LocalDevice и RemoteDevice, которые расширяют класс Device. Одним из основных отличий между LocalDevice и RemoteDevice является то, что RemoteDevice, скорее всего, полностью гидратируется - все его определения XML-сервисов анализируются, а действия и состояния UPnP заполняются в объекте RemoteDevice.
При выполнении поиска в локальной сети для устройств Cling не дожидается полного гидратации обнаруженного объекта устройства и вызывает localDeviceAdded()
, который в свою очередь вызывает deviceAdded()
. Когда это будет сделано, он вызовет remoteDeviceDiscoveryStarted()
и попытается полностью увлажнить устройства, найденные в поиске. Если устройство было успешно увлажнено, то Клинг будет звонить remoteDeviceAdded()
, который, в свою очередь, вызывает deviceAdded()
. Если устройство не может быть полностью увлажнено, то вместо этого Cling будет звонить remoteDeviceDiscoveryFailed()
.
Просто, чтобы сделать его немного больше графики:
Start search
+
|
| Device discovered
|
v
calls
LocalDeviceAdded()
+
| calls
| remoteDeviceDiscoveryStarted()
|
v
Attempt to hydrate
+
|
|
calls Success | Failure calls
remoteDeviceAdded() <---------+---------> remoteDeviceDiscoveryFailed()
Так что теперь, чтобы ответить на ваш вопрос, это действительно зависит от того, что вы хотите выполнить в приложении:
- Если вы нужно только указать основную информацию об обнаруженных устройствах, вы можете использовать LocalDevice, который вы получили в
localDeviceAdded()
- Если вам необходимо выполнить действия с устройством, вам понадобится RemoteDevice от
remoteDeviceAdded()
.
Лично я хотел бы пойти на третий вариант, где я начать работать с LocalDevice (может кэшировать его где-нибудь, или отобразить) и ждать устройства, чтобы стать полностью гидратированного RemoteDevice читать свое состояние и выполнять действия.
Спасибо, он объясняет большой – nmxprime