Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi [Android] Maps Marker ressource schonend laden/verwalten?? (https://www.delphipraxis.net/190407-%5Bandroid%5D-maps-marker-ressource-schonend-laden-verwalten.html)

BBoy 30. Sep 2016 10:23


[Android] Maps Marker ressource schonend laden/verwalten??
 
Ich verwende eine Tmaps Karte und lade Marker hinzu aus einer Datenbank.
Derzeit bin ich bei etwa 300 Markern und merke schon wie die App in die Knie geht, also ruckelt... es dauert immer länger bis die Marker geladen sind je mehr es sind. Der normale betrieb der App ist kein Problem aber das Laden macht Probleme.
Wende ich dann einen Filter an, macht sich das richtig bemerkbar.

Ich habe eine ähnliche App aus dem Markt und dort kann man viele hundert Marker einladen ohne das sich das irgendwie bemerkbar macht.

Habt ihr ein paar Tipps was ich tun kannn damit das bei meiner App auch funktioniert?

Hier mal meine Prozedur um die Datenbank zu lesen:
Code:
// Datenbank lesen
procedure TTabbedwithNavigationForm.read_database;
var
  lat, lon : String;
  Position: TMapCoordinate;
begin
  sqlquery1.SQL.Clear;
  SQLQuery1.SQL.Text := 'SELECT * FROM p_marker ORDER BY Min';
  SQLQuery1.Active := true;
  SQLQuery1.First;
  while not SQLQuery1.Eof do begin
    if not SQLQuery1.IsEmpty then begin
      lat := sqlquery1.FieldByName('Lat').Asstring;
      lon := sqlquery1.FieldByName('Lon').Asstring;
      lat := stringreplace(lat,'.',',',[rfReplaceAll]);
      lon := stringreplace(lon,'.',',',[rfReplaceAll]);
      position.Latitude := strtofloat(lat);
      position.Longitude:= strtofloat(lon);

      maxtime := sqlquery1.FieldByName('Min').AsInteger +20;
       if maxtime >60  then
         maxtime := maxtime -60;

      mapview1.BeginUpdate;
      MyMarker := TMapMarkerDescriptor.Create(Position, sqlquery1.FieldByName('Name').Asstring+' :'+format('%.2d',[sqlquery1.FieldByName('Min').Asinteger])+'-'+format('%.2d',[maxtime]));
        MyMarker.Draggable := False;

      if sqlquery1.FieldByName('Type').AsString ='bl' then
          MyMarker.Icon := Image1.Bitmap;
        if sqlquery1.FieldByName('Type').AsString ='rd' then
          MyMarker.Icon := Image2.Bitmap;
        if sqlquery1.FieldByName('Type').AsString ='blu' then
          MyMarker.Icon := Image3.Bitmap;
        if sqlquery1.FieldByName('Type').AsString ='ye' then
          MyMarker.Icon := Image4.Bitmap;
        MyMarker.Visible :=True;
        Fmarkers.Add(MapView1.AddMarker(MyMarker));
        sqlquery1.Next;
    end;
  end;
    mapview1.EndUpdate;
end;
mapview.beginupdate bringt leider nicht den gewünschten erfolg ähnlich bei grid's .

Mavarik 30. Sep 2016 11:20

AW: [Android] Maps Marker ressource schonend laden/verwalten??
 
Lade die Marker Daten erstmal im Thread...

Werden den alle Marker auch angezeigt oder ist ggf. die aktuelle Zoomstufe so, dass 200 Marker nicht in view sind?

Zeige erst die an, die in view und dann nach und nach die anderen setzen.
Somit hast Du einen schnelle Reaktion für den User.

Mavarik

BBoy 30. Sep 2016 11:25

AW: [Android] Maps Marker ressource schonend laden/verwalten??
 
Das mit dem Thread kann ich mal versuchen. Danke.

Derzeit werden alle Marker geladen und auch angezeigt. Die Zoom-Stufe ist so gesetzt das die meisten auch im View sind.

Zitat:

Zeige erst die an, die in view und dann nach und nach die anderen setzen.
Wie mache ich das?

Ich müsste alle Marker laden und dann innerhalb einer If Schleife abfragen ob der betreffende Marker in View ist. Wenn ja anzeigen, wenn nein dann nicht. Oder?
Ist das dann wirklich schneller? Laden und dann noch die Schleife?

Mit anzeigen ist wahrscheinlich Visible gemeint....

Aviator 30. Sep 2016 11:34

AW: [Android] Maps Marker ressource schonend laden/verwalten??
 
Ich kanns mir nicht verkneifen: http://if-schleife.de/ :lol:

Mavarik 30. Sep 2016 11:35

AW: [Android] Maps Marker ressource schonend laden/verwalten??
 
Zitat:

Zitat von BBoy (Beitrag 1349330)
Ist das dann wirklich schneller? Laden und dann noch die Schleife?

Langsamer als deine Umkonvertierung jedenfalls nicht.

Delphi-Quellcode:
      lat := sqlquery1.FieldByName('Lat').Asstring;
      lon := sqlquery1.FieldByName('Lon').Asstring;
      lat := stringreplace(lat,'.',',',[rfReplaceAll]);
      lon := stringreplace(lon,'.',',',[rfReplaceAll]);
      position.Latitude := strtofloat(lat);
      position.Longitude:= strtofloat(lon);

      maxtime := sqlquery1.FieldByName('Min').AsInteger +20;
       if maxtime >60  then
         maxtime := maxtime -60;
300 Marker aus einer SQLite Datenbank laden wirst Du kaum merken...

und ein

Delphi-Quellcode:
 for i:=0 to High(MarkerArray) do // Edit
   begin
     if MarkerInView(MarkerArray[i])
       then ShowMarker(I)
       else ShowMarkerQueued(I);
   end;
Kostet "garnix"..

nikosophi 2. Okt 2016 19:21

AW: [Android] Maps Marker ressource schonend laden/verwalten??
 
Zitat:

Zitat von BBoy (Beitrag 1349307)

Code:
   while not SQLQuery1.Eof do begin
  ...
      mapview1.BeginUpdate;

BeginUpdate sollte vor das "while", oder?

dataspider 4. Okt 2016 06:28

AW: [Android] Maps Marker ressource schonend laden/verwalten??
 
Zitat:

Zitat von nikosophi (Beitrag 1349526)

BeginUpdate sollte vor das "while", oder?

Das sehe ich genau so...

Und das Format würde ich auch eliminieren.
IMHO ist Format grottenlahm...

Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz