2016-08-19 61 views
0

當傳遞一個靜態字符串到這個委託時,我得到了這個問題,我試着將靜態字符串的值複製到普通字符串,它工作正常。NullReferenceException外部代碼Xamarin-Android

((JsonHttpClient)connection).RequestFilter = httpReq => 
{ 
    string authtoken = MemoryCache.authToken; 
    httpReq.Headers.Add(UdareConstants.AuthTokenKey, authtoken); 
}; 

此外,硬編碼值的工作正常。

((JsonHttpClient)connection).RequestFilter = httpReq => 
{ 
    string authtoken = "62bebc52-fde3-4f47-beab-6a3e4e3440f0"; 
    httpReq.Headers.Add(UdareConstants.AuthTokenKey, authtoken); 
}; 

MemoryCache這是一個靜態類和authToken財產這是一個靜態的字符串。

這讓我瘋狂。

The call stack from the exception

Console output after app crashes

+0

你是如何初始化MemoryCache.authToken的? –

+0

開始的代碼我做 MemoryCache.authToken =「62bebc52-fde3-4f47-beab-6a3e4e3440f0」; – Loucry

+0

您可以嘗試添加數據斷點來調查該錯誤。這可能是有趣的:http://stackoverflow.com/questions/4086039/data-breakpoints-in-java-eclipse –

回答

0

我沒有用Java編碼年齡和我從來沒有使用Xamarin但你可能遇到了一些東西有關Java的內存模型。

Java documentation它說:

  • 主題中的每個動作之前發生在後來談到在程序的順序該線程的每一個動作。

  • 監視器的解鎖(同步塊或方法退出)發生在相同監視器的每個後續鎖定(同步塊或方法條目)之前。並且因爲發生在before關係是傳遞性的,所以在解鎖之前的線程的所有動作發生在任何線程鎖定該監視器之後的所有動作之前。

  • 寫入易失性字段發生 - 在每次後續讀取同一字段之前。寫入和讀取易失性字段具有與進入和退出監視器類似的內存一致性效果,但不需要互斥鎖定。

  • 在啓動的線程中的任何操作之前,都會發生在線程上啓動的調用。

  • 線程中的所有操作都會在任何其他線程成功從該線程上的連接返回之前發生。

你可以閱讀更多的關於它的Nathan Hughes' answer on SO.

另一種選擇是,你碰到的問題與static field initialization order

BTW:靜態變量通常是一個壞主意。