1

我正在尝试执行以下代码:

          public void OnLocationChanged(Location location) {


        var lat = (TextView)FindViewById<TextView> (Resource.Id.latitude);
        var lon = (TextView)FindViewById<TextView> (Resource.Id.longitude);
        var stName = (TextView)FindViewById<TextView> (Resource.Id.st_name);

        lat.Text = string.Format ("Latitude: {0:N5}",location.Latitude);
        lon.Text = string.Format ("Longitude: {0:N5}", location.Longitude);


        try{
            Geocoder geocode = new Geocoder (this);
            List<Address> getAddrTask = new List<Address>(geocode.GetFromLocation(location.Latitude,location.Longitude,1));
                Address returnedAddress = getAddrTask.FirstOrDefault();
            if(returnedAddress != null){
                System.Text.StringBuilder strReturnedAddress = new StringBuilder();
                for(int i=0; i<returnedAddress.MaxAddressLineIndex;i++){
                    strReturnedAddress.Append(returnedAddress.GetAddressLine(i)).AppendLine(",");
                }
                stName.Text = strReturnedAddress.ToString();
            }
        }
        catch(IOException e){
            Toast.MakeText (this, e.Message, ToastLength.Long).Show ();
        }

    }

这一切都很棒而且很迷人,但是在执行它时,它给了我应用程序输出:[Choreographer] 跳过了 42 帧!应用程序可能在其主线程上做了太多工作。

4

3 回答 3

1

好的,如果您想将其用作地图,您可以使用它

字符串 locationString = @" http://maps.google.com/maps/api/staticmap?center= " + latitude + "," + longitude + "&zoom=14&size=250x250&maptype=roadmap&markers=color:red%7Clabel:S% 7C" + 纬度 + "," + 经度 + "&sensor=false";

                       webBrowser1.Url = new System.Uri(locationString);
于 2013-11-08T19:41:50.880 回答
0

地理编码器可能是罪魁祸首。通常它需要访问 Internet 来查找地址,并且延迟将是不可预测的(并且可能足够长以导致弹出应用程序无响应错误对话框)。

你应该将你的 try/catch 块移动到一个AsyncTask,这样这个任务就不会在主线程上运行。我不熟悉 Xamarin,但您可以查看如何使用 AsyncTask。

于 2013-11-08T19:41:22.573 回答
0

罪魁祸首肯定是地理编码器。通常,您应该在后台执行网络任务,以免阻塞 UI 线程。

Xamarin 网站上有一个关于如何在线程中使用 Geocoder的配方。

于 2013-11-09T15:35:51.670 回答