AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

einfacher Waiting-Indicator für Android

Ein Thema von philipp.hofmann · begonnen am 24. Jul 2020 · letzter Beitrag vom 24. Jul 2020
Antwort Antwort
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
898 Beiträge
 
Delphi 10.4 Sydney
 
#1

einfacher Waiting-Indicator für Android

  Alt 24. Jul 2020, 14:23
Hi,

ich versuche gerade einen ganz einfachen Waiting-Indicator für Android darzustellen. Unter Windows und MacOS ja ganz einfach, einfach crHourGlass bzw. crDefault anzeigen und gut ist, das funktioniert auch im MainThread. Unter iOS und Android ist es ja jetzt etwas schwieriger v.a. wenn man die eigentliche Operation im MainThread durchführt. Ein TAniIndicator bewegt sich da dann leider nicht.
Ich habe daher ein einfaches TImage genommen und ein Sandbox-Bild reingeladen (reicht mir aus, Hauptsache der User weiß, dass gerade etwas passiert).
Normalerweise ist dieses Image versteckt und wenn man etwas klickt, wird es an der Stelle des Klick/Tap angezeigt.

Klappt unter iOS wunderbar. Unter Android sehe ich aber nichts (auch nicht, wenn ich ein sleep(1000) einfüge).
Das es an sich an der richtigen Stelle platziert ist, weiß ich, weil ich in hideHourGlass das isVisible:=false mal auskommentiert habe und
dann sehe ich das Warten-Symbol an der Stelle der letzten Aktion, wo es eingeblendet wurde.

D.h. meine Frage ist, wie bekomme ich das Display unter Android aktualisiert?

Grüße, Philipp

Delphi-Quellcode:
procedure TicTrainerF.showHourglass(sender:TObject);
begin
  {$if defined(IOS) or defined(ANDROID)}
    if ((sender<>nil) and (sender is TControl)) then
    begin
      progressArc.Position:=(sender as TControl).Position;
      progressArc.Parent:=(sender as TControl).Parent;
    end else begin
      progressArc.Position.X:=50;
      progressArc.Position.Y:=50;
      progressArc.Parent:=self;
    end;
    progressArc.Visible:=true;
    progressArc.repaint();
    Application.ProcessMessages();
  {$ELSE}
    if (cs<>nil) then
      cs.SetCursor(crHourGlass);
  {$ENDIF}
end;

procedure TicTrainerF.hideHourglass();
begin
  {$if defined(IOS) or defined(ANDROID)}
    progressArc.Visible:=false;
  {$ELSE}
    if (cs<>nil) then
      cs.SetCursor(crDefault);
  {$ENDIF}
end;
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#2

AW: einfacher Waiting-Indicator für Android

  Alt 24. Jul 2020, 14:33
Du musst wahrscheinlich schon den Aufruf asynchron machen.
Ich arbeite z.B. oft mit TThread.ForceQueue, geht an jeder Stelle und schadet nicht.
Kann aber blockierende Tasks schön entkoppeln.

Delphi-Quellcode:
  ShowIndicator;

  TThread.ForceQueue(
    nil,
    procedure
    begin
       DoBlockingStuff;
    end );

Ach ja, und ApplicationProcessMessages würde ich möglichst Vermeiden, das richtet mehr Schaden an als es nutzt.
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
898 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: einfacher Waiting-Indicator für Android

  Alt 24. Jul 2020, 15:10
Genau das mit dem asynchronen Aufruf will ich ja vermeiden, ich will den unter Windows/MacOS/iOS laufenden Code ja nicht anpassen müssen.
Es ist ja okay, dass alles blockiert ist, da geht es auch nur um 1-3 Sekunden, wo der Anwender geduldig sein soll.

Es geht ja "nur" darum, dass davor erfolgreich ein Image eingeblendet wird.
P.S.: Unter iOS war das Application.processMessages notwendig, damit das Image angezeigt wird.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#4

AW: einfacher Waiting-Indicator für Android

  Alt 24. Jul 2020, 15:43
Ok, aber ich habe mis Sanchrone schon abgewöhnt.
Es führt immer wieder zu seltsamen Verhalten auf den mobilen Platformen.
Ich kann nur empfehlen möglichst entkoppeln und asynchron halten.

Übrigens würde das in deinem Beispiel wohl auch auf dem Desktop nicht immer korrekt Updaten blockieren.
Wenn nach dem Show direkt was blockiert kann es da genauso haken.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: einfacher Waiting-Indicator für Android

  Alt 24. Jul 2020, 15:46
Das Queue/ForceQueue ist kein Thread ... es wartet auch, nur eben nicht sofort, sonder erst dann, wenn beim nächsten Mal die MessageQueue verarbeitet wird.
Stell es dir wie ein PostMessage oder einen TTimer mit 1 Millisekunden vor, den du statest und später wird der Code ausgeführt (und der Timer wieder gestoppt).
Bzw. das ForceQueue ist fast wie ein ProcessMessages vor dem folgenden/enthaltenen Code.

OK, bei paar wenigen Sekunden nicht unbedingt nötig, aber ein Thread wäre für längere Pausen schon die bessere Lösung.


Am Besten immer ForceQueue verwenden, denn das ist der Bugfix, da jemand auf die geile Idee kam dass wenn man Queue im Hauptthread benutzt, dann wird es sofort ausgeführt, anstatt es in die Queue zu stecken.
$2B or not $2B

Geändert von himitsu (24. Jul 2020 um 15:51 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#6

AW: einfacher Waiting-Indicator für Android

  Alt 24. Jul 2020, 18:34
Ja das ForeceQueue ist kein Thread, man kann es im MainUi oder Thread nutzen ohne das es Probleme macht.
Ich meinte ja das es den Aufruf etwas asynchron feuert, wenn z.b. ein Event schon verlassen wurde.
Das reicht meist damit ein Refresh ordentlich gezeichnet wird,
bevor das Blocking startet.
Hatte vorher ein Delay drin, das nehme ich aber nur noch in Härtefällen.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:13 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