这是一个有效的操作吗?
final IOSGiService service = (IOSGiService) bundleContext.getService(reference);
bundleContext.ungetService(reference);
service.executeSomeOperaton();
我每次都能安全地运行方法executeSomeOperaton()
吗?
答案 0 :(得分:1)
您将拥有该对象,您将能够在其上调用函数。但是,您无法确定对象是否仍处于正确状态。如果服务提供商关闭了该功能所需的一些资源,该怎么办?
您不应该以这种方式使用服务。即使您没有调用 unget(),当您在其上调用该函数时,您甚至无法确定该服务是否处于正确状态。您应该使用Felix Felix SCR之类的技术。在这种情况下,如果引用不再可用,则将停用对象,或者如果指定引用为动态,则将在对象上调用unbind方法。从那以后,您就会知道该服务何时真正可用。
使用的替代方法:Apache Felix iPojo,Apache Aries Blueprint或使用ServiceTracker来捕获您使用的服务的事件。
<强>更新强>:
所以换句话说,取消服务与否将完全没有区别,除非我真的想让服务使用计数器保持正确吗?
有些情况下,取消服务真的很重要。例如,如果提供者注册了ServiceFactory而不是服务对象本身,则可以在提供者端捕获unget事件。在这种情况下,只要在服务上调用unget,就可以释放资源。
我记得当消费者包被停止时(但我不确定),会检索消费者包的所有服务引用(unget被调用)。