ServiceTracker被定義爲OSGI 4.2規範中的線程安全級別OSGI ServiceTracker和線程安全
該類的用法非常簡單。
大部分採用ServiceTracker的,我可以在互聯網上找到的例子顯示的代碼片段如下所示:
ServiceInterface serviceObj = (ServiceInterface) serviceTracker.get();
if(serviceObj != null) {
// ...
// do smth with the serviceObject
// ...
}
現在我的問題是:一旦服務實現對象從ServiceTracker的檢索,有不能保證在空檢查後立即可用(不會被刪除)。
換句話說,即使在如週期,服務對象(serviceObj)很可能爲空突然變得(如果相應的服務被註銷)
因此,我們應始終糾正上面的代碼是這樣的:
ServiceInterface serviceObj = (ServiceInterface) serviceTracker.get();
if(serviceObj != null) {
try {
// ...
// do smth with the serviceObject
// ...
} catch(Throwable th) {
// a null-pointer exception may have occurred here!!
}
}
儘管這樣,沒有例子無論是在博客(http://developers-blog.org/blog/default/2010/03/31/OSGI-Tutorial-How-to-use-ServiceTracker-to-get-Services)或書籍(OSGI在行動)談論這個要求......
我說得對不對?我錯過了什麼嗎?
謝謝您的回答 –
Re:null。你提出了一個有關空值問題的有趣觀點。你是對的:一個局部變量不能在其範圍之外被修改。因此,引用**將保持有效**直到它超出範圍。現在從我讀到的關於Osgi的內容來看,我們通過查詢服務註冊表得到的參考資料不過是實際的服務實現類(一個java類)。因此,我的代碼應該始終工作,if-cycle中的異常永遠不會被拋出......我在這裏丟失了什麼? –
PS:根據我的經驗,我確實得到了一個空指針異常至少一次 –