![](/img/trans.png)
[英]Remove all markers without the use of map.clear() Google maps - Xamarin
[英]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.