0

Ich bin ganz neu zu Xamarin, so pls kein Hass ...Xamarin Android Google Maps aktualisieren Map Markers Async

Ich möchte eine Google Maps-App erstellen, die alle zur Zeit zeigt Vatsim Piloten fliegen (Vatsim ein Online-Netzwerk ist für Flugsimmer).

Ich zeige die Piloten mit Markierungen auf der Karte (mit einem benutzerdefinierten Bild).

Derzeit aktualisiere ich die Karte nur einmal beim Start!

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

Das funktioniert gut. Jeder ist an der richtigen Stelle ...

Jetzt möchte ich die Karte alle x Sekunden aktualisieren.

kam ich mit diesem Code auf:

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

Mit diesem Code, den ich aber die Karte ist sehr, sehr laggy und nach ein paar Sekunden die App abstürzt keine Markierungen auf der Karte sehen. Das Ausgabefenster in Visual Studio ist nicht sehr hilfreich, da es ständig Informationen über den Worker anzeigt. Die Intervallzeit ist derzeit auf 10 Sekunden eingestellt.

Vielen Dank für Ihre Hilfe im Voraus!

+0

Könnten Sie bitte eine grundlegende Demo oder vollständigere teilen dieses Problem zu reproduzieren? –

+0

Ich denke, ich muss Code sehen, der Ihnen hilft, das Problem zu lokalisieren, und fügen Sie bitte ein vollständiges Diagnose-Fehlerprotokoll hinzu. –

Antwort

0

die Karte ist sehr sehr laggy und nach ein paar Sekunden stürzt die App ab.

Ich denke, etwas blockiert Ihren UI-Thread und verursacht App-Absturz. Wenn der UI-Thread einer Android-App zu lange blockiert ist, wird ein "Application Not Responding" (ANR) Fehler ausgelöst.

Ich möchte die Karte alle x Sekunden aktualisieren.

Sie können eine Aufgabe erstellen, die Sie Map alle x Sekunden aktualisieren können helfen:

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

@Maxlisui, haben Sie Ihr Problem gelöst? –