簡體   English   中英

NullReferenceException外部代碼Xamarin-Android

[英]NullReferenceException external code 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屬性是一個靜態字符串。

這讓我發瘋。

來自異常的調用堆棧

應用程序崩潰后的控制台輸出

我已經有很長時間沒有使用Java編碼了,並且從未使用過Xamarin,但是您可能會遇到一些與Java內存模型相關的東西。

Java文檔說:

  • 線程中的每個動作都會發生-在該線程中的每個動作之前,該動作按程序順序出現。

  • 監視器的解鎖(同步塊或方法退出)發生在同一監視器的每個后續鎖定(同步塊或方法入口)之前。 並且由於事前發生關系是可傳遞的,因此在解鎖之前,線程的所有操作都發生在監視該線程的所有線程之后的所有操作之前。

  • 在每次后續讀取同一字段之前,都會對易失字段進行寫操作。 易失性字段的寫入和讀取與進入和退出監視器具有相似的內存一致性效果,但是不需要互斥鎖定。

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

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

您可以在Nathan Hughes關於SO的答案中閱讀更多有關它的內容

另一個選擇是您遇到了靜態字段初始化順序的問題

順便說一句:靜態變量通常不是一個好主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM