ServiceTracker 何时取消获取 ServiceReference?
When does ServiceTracker unget ServiceReference?
我在许多文章中读到,一旦使用 服务,就必须取消服务。我是说
//1. get service
ServiceReference reference = bundleContext.getServiceReference(Foo.class.getName());
Foo foo=(Foo) bundleContext.getService(reference);
//2. use service
foo.foo();
//3. unget service
bunldeContext.ungetService(reference)
除了
The OSGi framework maintains a use count of each service for your
bundle.
这是一方面。从另一方面看,osgi 服务来来去去,因此在动态世界中,保留对 osgi 服务的引用是不好的做法,但在需要时获取服务是好的做法。
如果这个说法正确那么ServiceTracker呢?据我了解,它在服务到来时同时保留对服务和 ServiceReference 的引用,并一直保留到服务结束。但是,在使用服务时,ServiceReference 必须是 unget 怎么办?或者在 ServiceTracker 的情况下,我们的意思是服务使用时间 = 跟踪器打开的时间?
所以主要问题是 - ServiceTracker 何时取消获取 ServiceReference,为什么?
您真的应该使用 OSGi 的声明式服务,而不是使用原始服务 API 甚至服务跟踪器。也就是说,Service Tracker 侦听它正在跟踪的服务的服务事件。因此,当服务未注册或跟踪器关闭时,它将取消服务。
我在许多文章中读到,一旦使用 服务,就必须取消服务。我是说
//1. get service
ServiceReference reference = bundleContext.getServiceReference(Foo.class.getName());
Foo foo=(Foo) bundleContext.getService(reference);
//2. use service
foo.foo();
//3. unget service
bunldeContext.ungetService(reference)
除了
The OSGi framework maintains a use count of each service for your bundle.
这是一方面。从另一方面看,osgi 服务来来去去,因此在动态世界中,保留对 osgi 服务的引用是不好的做法,但在需要时获取服务是好的做法。
如果这个说法正确那么ServiceTracker呢?据我了解,它在服务到来时同时保留对服务和 ServiceReference 的引用,并一直保留到服务结束。但是,在使用服务时,ServiceReference 必须是 unget 怎么办?或者在 ServiceTracker 的情况下,我们的意思是服务使用时间 = 跟踪器打开的时间?
所以主要问题是 - ServiceTracker 何时取消获取 ServiceReference,为什么?
您真的应该使用 OSGi 的声明式服务,而不是使用原始服务 API 甚至服务跟踪器。也就是说,Service Tracker 侦听它正在跟踪的服务的服务事件。因此,当服务未注册或跟踪器关闭时,它将取消服务。