public void FindCityName()
{
string url = "http://maps.google.com/maps/geo?q=39.920794,32.853902&output=json&oe=utf8&sensor=true&key=MYKEY";
var w = new WebClient();
Observable.FromEvent<DownloadStringCompletedEventArgs>(w, "DownloadStringCompleted").Subscribe(r =>
{
var deserialized = JsonConvert.DeserializeObject<RootObject>(r.EventArgs.Result);
string s = deserialized.Placemark[0].AddressDetails.Country.SubAdministrativeArea.Locality.LocalityName;
/// setCity() and City=s produce the same thing
setCity(s);
City = s;
//foreach (var item in deserialized.Placemark)
//{
// //MessageBox.Show(item.AddressDetails.Country.SubAdministrativeArea.Locality.LocalityName);
// City = (string)item.AddressDetails.Country.SubAdministrativeArea.Locality.LocalityName;
//}
//Problem here >>>>>
////MessageBox.Show(City);
});
w.DownloadStringAsync(new Uri(url));
}
问题:
我正在开发一个Windows Phone 7应用程序,我需要从GPS坐标中找到“城市名称”才能继续前进......
我在互联网上找到了上面的代码并试了一下。我可以通过使用这些代码看到城市名称(Message.Box(城市)显示我想要的,城市名称)。但是,这行代码
deserialized.Placemark[0].AddressDetails.Country.SubAdministrativeArea.Locality.LocalityName;
这给了我城市名称似乎给出了一个易变的字符串值。
例如,我创建了一个方法,它将字符串变量“s”的值赋给我的类的字符串字段,名称为City。如果我在调用FindCityName()方法后尝试获取City的内容,我会看到City的内容未更新。
再次,同样的事情发生,然后我在评论“问题在这里&gt;&gt;&gt;&gt;&gt;”下调用代码行MessageBox.Show(City)没有显示任何新内容......
有人能解释我问题的原因吗?
答案 0 :(得分:1)
你也把这个问题放在我的博客上,但我会在这里回答。我觉得有点负责首先提出示例代码; - )
我将假设包含您的代码的类看起来像这样:
public class MyClass
{
private void MyMethod()
{
FindCityName();
MessageBox.Show(City);
}
private void FindCityName()
{
// Code omitted - see your question
}
private string City;
}
字符串没有任何不稳定因素。您的问题是 asynchronicity 。如果你仔细观察,你会看到我使用了一个在触发DownloadStringCompleted时触发的observable。 Observable.Event中的代码仅在下载完成时被称为 ,但这是异步发生的。但我假设你做的是调用FindCityName方法,然后直接尝试访问我在MyMethod方法中显示的结果。这就像在触发请求后直接想要结果一样。结果还没有!这就像一个网页下载 - 它需要一段时间。您可以使用回调修复此问题,如下所示:
public class MyClass
{
private void MyMethod()
{
FindName();
}
public void FindCityName()
{
string url = "http://maps.google.com/maps/geo?q=39.920794,32.853902&output=json&oe=utf8&sensor=true&key=MYKEY";
var w = new WebClient();
Observable.FromEvent<DownloadStringCompletedEventArgs>(w, "DownloadStringCompleted").Subscribe(r =>
{
var deserialized = JsonConvert.DeserializeObject<RootObject>(r.EventArgs.Result);
City = deserialized.Placemark[0].AddressDetails.Country.SubAdministrativeArea.Locality.LocalityName;
DoneDownloading();
});
w.DownloadStringAsync(new Uri(url));
}
private string City;
private void DoneDownloading
{
MessageBox.Show(City);
}
}
这有帮助吗?
答案 1 :(得分:0)
我建议您使用此Google Map API
http://maps.googleapis.com/maps/api/geocode/json?latlng=39.920794,32.853902&sensor=true
一旦您在请求中获得JSON响应。您可以使用NEWTONSOFT轻松解析wp7
WebClient wc = new WebClient();
var json = (JObject)JsonConvert.DeserializeObject(wc.DownloadString(url));
var locality= json["results"]
.SelectMany(x => x["address_components"])
.FirstOrDefault(t => t["types"].First().ToString() == "locality");
var name = locality!=null ? locality["long_name"].ToString() : "";