2016-08-19 28 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:静态变量通常是一个坏主意。