0
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(City) は、必要なもの、都市名を正確に表示します)。ただし、このコード行

deserialized.Placemark[0].AddressDetails.Country.SubAdministrativeArea.Locality.LocalityName;

これにより、都市名が揮発性の文字列値を与えるようです。

たとえば、City という名前のクラスの文字列フィールドに文字列変数 "s" の値を割り当てるメソッドを作成しました。FindCityName() メソッドを呼び出した後に City のコンテンツを取得しようとすると、City のコンテンツが更新されていないことがわかります。

繰り返しますが、同じことが起こり、MessageBox.Show(City) が何も新しいことを示していないというコメント「ここで問題 >>>>>」の下にあるコード行を呼び出します...

誰かが私の問題の理由を説明できますか?

4

2 に答える 2

1

あなたはこの質問を私のブログにも載せましたが、ここで答えます。そもそもサンプルコードを載せたことに少し責任を感じています;-)

コードを含むクラスは次のようになると仮定します。

public class MyClass
{
    private void MyMethod()
    {
      FindCityName();
      MessageBox.Show(City);
    }

    private void FindCityName()
    {
      // Code omitted - see your question
    }

    private string City;
}

文字列には揮発性はありません。あなたの問題は非同期性です。注意深く見ると、DownloadStringCompleted が起動されたときに起動するオブザーバブルを使用していることがわかります。Observable.Event 内のコードは、ダウンロードが完了したときにのみ呼び出されますが、それは非同期で行われます。しかし、私が想定しているのは、FindCityName メソッドを呼び出してから、MyMethod メソッドで示したような結果に直接アクセスしようとすることです。これは、リクエストを発行した後に直接結果を求めるようなものです。結果はまだ出ていません!これは Web ページのダウンロードのようなもので、しばらく時間がかかります。次のようなコールバックで修正できます。

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);
    }
}

それは役に立ちますか?

于 2012-08-19T14:20:37.080 に答える
0

この Google Map API を使用することをお勧めします

http://maps.googleapis.com/maps/api/geocode/json?latlng=39.920794,32.853902&sensor=true

そして、リクエストで JSON レスポンスを取得したら。wp7のNEWTONSOFTで簡単に解析できます

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() : "";
于 2012-08-16T04:49:51.327 に答える