Tôi chỉ mới bắt đầu với lập trình OSGi và đã đi qua hai cách để nghe cho các dịch vụ được kích hoạt.Khi nào sử dụng ServiceTracker vs ServiceReference
Cách đầu tiên, từ một cuốn sách EclipseRCP, sử dụng ServiceReference:
String filter="(objectclass="+IModelCreator.class.getName()+")";
context.addServiceListener(this, filter);
modelCreators = Collections.synchronizedMap(
new HashMap<ModelID, List<IModelCreator>>());
ServiceReference references[] = context.getServiceReferences(null, filter);
if(references==null) return;
for(int i=0;i<references.length;++i) {
this.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED,
references[i]));
}
Thứ hai, từ các ví dụ internet, sử dụng ServiceTracker:
ServiceTracker logReaderTracker = new ServiceTracker(context,
org.osgi.service.log.LogReaderService.class.getName(), null);
logReaderTracker.open();
Object[] readers = logReaderTracker.getServices();
if (readers != null) {
for (int i = 0; i < readers.length; i++) {
LogReaderService lrs = (LogReaderService) readers[i];
m_readers.add(lrs);
lrs.addLogListener(m_logger);
}
}
logReaderTracker.close();
Mà một trong số đó là đúng và/hoặc cách tốt nhất để giữ một đăng ký của tất cả các dịch vụ thực hiện một giao diện nhất định? Có cách nào khác để hoàn thành việc này không? Tại sao dường như có hai cách để làm điều tương tự?