【问题标题】:NullReferenceException external code Xamarin-AndroidNullReferenceException 外部代码 Xamarin-Android
【发布时间】:2023-03-22 21:00:01
【问题描述】:

我在将静态字符串传递给这个委托时遇到了这个问题,我尝试将静态字符串的值复制到普通字符串,它工作正常。

((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 属性是一个静态字符串。

这让我发疯了。

【问题讨论】:

  • 如何初始化 MemoryCache.authToken?
  • 在代码的开头我做 MemoryCache.authToken = "62bebc52-fde3-4f47-beab-6a3e4e3440f0";
  • 您可以尝试添加数据断点来调查该错误。这可能很有趣:stackoverflow.com/questions/4086039/…

标签: c# android xamarin nullreferenceexception


【解决方案1】:

我已经很久没有使用 Java 编码了,也从未使用过 Xamarin,但您可能遇到了一些与 Java 内存模型相关的东西。

Java documentation 上面写着:

  • 线程中的每个动作都发生在该线程中按程序顺序稍后出现的每个动作之前。

  • 监视器的解锁(同步块或方法退出)发生在同一监视器的每个后续锁定(同步块或方法入口)之前。并且由于happens-before关系是可传递的,因此线程在解锁之前的所有动作都发生在任何线程锁定该监视器之后的所有动作之前。

  • 对 volatile 字段的写入发生在对同一字段的每次后续读取之前。 volatile 字段的写入和读取具有与进入和退出监视器类似的内存一致性效果,但不需要互斥锁定。

  • 在线程上启动的调用发生在已启动线程中的任何操作之前。

  • 线程中的所有操作都发生在任何其他线程从该线程的连接成功返回之前。

你可以在Nathan Hughes' answer on SO.阅读更多关于它的信息

另一种选择是您遇到了static field initialization order 的问题。

顺便说一句:静态变量通常不是个好主意。

【讨论】:

    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    相关资源
    最近更新 更多