2016-08-19 2 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

в начале кода i do MemoryCache.authToken = "62beb52-fde3-4f47-beab-6a3e4e3440f0"; – Loucry

+0

Вы можете попробовать добавить контрольные точки данных, чтобы исследовать эту ошибку. Это может представлять интерес: http://stackoverflow.com/questions/4086039/data-breakpoints-in-java-eclipse –

ответ

0

Я не закодированы в Java в течение веков, и я никогда не использовал Xamarin, но вы могли бы работать в какой-нибудь вещи, связанные с моделью памяти Java.

Java documentation, который говорит:

  • Каждое действие в потоке происходит, перед каждым действием в этом потоке, который приходит позже, чтобы программы.

  • Разблокировка (синхронизированный выход блока или метода) монитора происходит до каждой последующей блокировки (синхронизированный блок или ввод метода) того же монитора. И поскольку отношение «происхождение-до» транзитивно, все действия потока до разблокировки происходят до всех действий, следующих за любой блокировкой потока, которые контролируют.

  • Запись в нестабильное поле происходит до каждого последующего чтения этого же поля. Записи и чтения изменчивых полей имеют аналогичные эффекты согласованности с памятью как входные и выходящие мониторы, но не влекут за собой блокировку взаимного исключения.

  • Вызов для начала в потоке случается - перед любым действием в начатом потоке.

  • Все действия в потоке происходят, прежде чем какой-либо другой поток успешно вернется из соединения в этом потоке.

Вы можете прочитать немного больше об этом в Nathan Hughes' answer on SO.

Другой вариант заключается в том, что вы столкнулись с вопросом static field initialization order.

BTW: Статические переменные обычно представляют собой плохую идею.

Смежные вопросы