繁体   English   中英

Xamarin Android Google Maps更新地图标记异步

[英]Xamarin Android Google Maps Update Map Markers Async

我对Xamarin非常陌生,所以请不要讨厌...

我想创建一个Google Maps应用程序,以显示当前所有正在飞行的Vatsim飞行员(Vatsim是飞行模拟器的在线网络)。

我在地图上显示带有标记的飞行员(带有自定义图像)。

目前,我在启动时仅更新一次地图!

private void drawPilots()
{
    List<VatsimPilot> pilots = Parser.GetPilots();

    var matrix = new Matrix();

    foreach (var pilot in pilots)
    {
        matrix.PostRotate(float.Parse(pilot.Heading.ToString()));

        _map.AddMarker(new MarkerOptions()
            .SetPosition(new LatLng(pilot.Latitude, pilot.Longitude))
            .SetTitle(pilot.Callsign)
            .SetIcon(BitmapDescriptorFactory.FromBitmap(
                Bitmap.CreateBitmap(_planeImg, 0, 0, _planeImg.Width, _planeImg.Height, matrix, true))));
    }
}

这很好。 每个人都在正确的地方...

现在,我想每x秒更新一次地图。

我想出了以下代码:

private void drawPilots()
{
    List<VatsimPilot> pilots;
    Task.Factory.StartNew(() =>
    {
        System.Diagnostics.Debug.WriteLine("Thread Started");
        while (true)
        {
            System.Diagnostics.Debug.WriteLine("Getting data");
            pilots = Parser.GetPilots();
            var matrix = new Matrix();

            RunOnUiThread(() =>
            {
                _map.Clear();
                System.Diagnostics.Debug.WriteLine("Updating Map");
                foreach (var pilot in pilots)
                {
                    matrix.PostRotate(float.Parse(pilot.Heading.ToString()));

                     _map.AddMarker(new MarkerOptions()
                         .SetPosition(new LatLng(pilot.Latitude, pilot.Longitude))
                         .SetTitle(pilot.Callsign)
                         .SetIcon(BitmapDescriptorFactory.FromBitmap(
                             Bitmap.CreateBitmap(_planeImg, 0, 0, _planeImg.Width, _planeImg.Height, matrix, true))));
                }
            });

            Thread.Sleep(Constants.UPDATE_INTERVALL_TIME);
        }
    });
}

使用此代码,我在地图上看不到任何标记,但是地图非常滞后,几秒钟后应用程序崩溃了。 Visual Studio中的输出窗口不是很有帮助,因为它不断显示有关工作程序的信息。 当前的间隔时间设置为10秒。

谢谢您的帮助!

地图非常缓慢,几秒钟后应用程序崩溃了。

我认为某些东西会阻塞您的UI线程并导致应用程序崩溃。 当Android应用程序的UI线程被阻止时间太长时,将触发“应用程序无响应”(ANR)错误。

我想每x秒更新一次地图。

您可以创建一个任务,以帮助您每x秒更新一次Map

void ChangedMapData()
{
    Task.Delay(x000).ContinueWith(t =>
    {
       UpdateYourMap();
       ChangedMapData();//This is for repeate every xs.
    }, TaskScheduler.FromCurrentSynchronizationContext());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM