2016-08-19 4 views
0

Ich habe dieses Problem bei der Übergabe einer statischen Zeichenfolge an diesen Delegaten, ich habe versucht, den Wert der statischen Zeichenfolge in den normalen String kopieren und es funktioniert gut.NullReferenceException externen Code Xamarin-Android

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

Auch harte Codierung der Wert funktioniert gut.

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

MemoryCache es ist eine statische Klasse und die authToken Eigenschaft es ist eine statische Zeichenfolge.

Das macht mich wahnsinnig.

The call stack from the exception

Console output after app crashes

+0

Wie initialisieren Sie MemoryCache.authToken? –

+0

am Anfang des Codes ich tun MemoryCache.authToken = "62bebc52-fde3-4f47-beab-6a3e4e3440f0"; – Loucry

+0

Sie können versuchen, Datenhaltepunkte hinzuzufügen, um diesen Fehler zu untersuchen. Dies könnte von Interesse sein: http://stackoverflow.com/questions/4086039/data-breakpoints-in-java-eclipse –

Antwort

0

Ich habe seit Ewigkeiten in Java codiert, und ich habe Xamarin nie benutzt, aber Sie könnten in ein paar Sachen zu Java-Speichermodell verwandt ausgeführt haben.

Java documentation die sagt:

  • Jede Aktion in einem Thread passiert-vor jeder Aktion in diesem Thread, die später in das Programm der Auftrag kommt.

  • Es erfolgt eine Entsperrung (synchronisierter Block oder Methodenausgang) eines Monitors vor jeder nachfolgenden Sperre (synchronisierter Block- oder Methodeneintrag) desselben Monitors. Und da die "happes-before" -Beziehung transitiv ist, werden alle Aktionen eines Threads vor dem Entsperren ausgeführt - vor allen Aktionen, die auf einen Thread folgen, der diesen Monitor sperrt.

  • Ein Schreiben in ein flüchtiges Feld geschieht - vor jedem weiteren Lesen desselben Feldes. Schreib- und Lesevorgänge flüchtiger Felder haben ähnliche Auswirkungen auf die Speicherkonsistenz wie das Ein- und Ausblenden von Monitoren, aber keine gegenseitige Ausschließungssperre.

  • Ein Aufruf zum Starten eines Threads erfolgt vor einer Aktion im gestarteten Thread.

  • Alle Aktionen in einem Thread passieren - bevor ein anderer Thread erfolgreich von einem Join in diesem Thread zurückkehrt.

Sie können ein bisschen mehr über sie in Nathan Hughes' answer on SO.

lesen Eine andere Möglichkeit ist, dass Sie in Ausgabe mit dem static field initialization order ausgeführt haben.

BTW: Statische Variablen sind normalerweise eine schlechte Idee.

Verwandte Themen