我正在编写一个与用户帐户一起使用的Xamarin.Forms跨平台应用程序。问题是我从我的数据库中获取了他们的用户名,但它并没有更新public static string username = "";
我假设这是因为它是在线程中运行或与WebRequest有关,我已经做了一段时间的安静研究,但一直无法找到解决方案。
我用来更新用户名的方法如下
private void loadUserData()
{
username = "Test";
Uri uri = new Uri("http://example.com/session-data.php?session_id=" + session);
WebRequest request = WebRequest.Create(uri);
request.BeginGetResponse((result) =>
{
try
{
Stream stream = request.EndGetResponse(result).GetResponseStream();
StreamReader reader = new StreamReader(stream);
Device.BeginInvokeOnMainThread(() =>
{
string page_result = reader.ReadToEnd();
var jsonReader = new JsonTextReader(new StringReader(page_result))
{
SupportMultipleContent = true // This is important!
};
var jsonSerializer = new JsonSerializer();
try
{
while (jsonReader.Read())
{
UserData userData = jsonSerializer.Deserialize<UserData>(jsonReader);
username = userData.username;
}
}
catch (Newtonsoft.Json.JsonReaderException readerExp)
{
string rEx = readerExp.Message;
Debug.WriteLine(rEx);
}
});
}
catch (Exception exc)
{
string ex = exc.Message;
Debug.WriteLine(ex);
}
}, null);
}
当打开网址时,会打印出以下行
{“id”:7,“username”:“TestUser”,“name”:“Test User”,“bio”:“Hello World”,“private”:0}
UserData包含以下代码
class UserData
{
[JsonProperty("id")]
public int id { get; set; }
[JsonProperty("username")]
public string username { get; set; }
[JsonProperty("name")]
public string name { get; set; }
[JsonProperty("bio")]
public string bio { get; set; }
[JsonProperty("private")]
public int isPrivate { get; set; }
}
我还注意到以下错误打印出来,我尝试使用Google搜索并且找不到任何我理解的解决方案
解析正无穷大值时出错。路径'',第0行,第0位。
答案 0 :(得分:7)
您获得的错误是JSON.net错误,并且在JSON反序列化期间发生,这意味着更新静态变量没有问题,因为代码永远不会到达那一点(它以{{1}结束})。
这很好地缩小了你的问题。您从服务器收到的响应很可能出现问题。在行catch (Newtonsoft.Json.JsonReaderException readerExp)
上放置一个断点并检查var jsonReader = ...
变量的内容,看它们是否包含任何意外字符。您也可以将响应转储到JSON验证器中以确认它是否实际有效(https://jsonlint.com/)
答案 1 :(得分:0)
每个变量都限定在专用于执行其声明的线程的内存中,因此,当您从另一个线程访问该变量时,您正在读取其他线程内存中的该副本。
当线程与另一个线程同步时执行此复制,并且在设置变量时并不总是这样做
因此,您必须在变量声明中添加volatile
修饰符,这表示必须在全局同步范围内分配和取消分配变量。
尝试声明您的变量,例如:
public static volatile string username = "";