Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi SharedActivity.getWindow.setFlags bringt immer Exception (https://www.delphipraxis.net/183317-sharedactivity-getwindow-setflags-bringt-immer-exception.html)

zeras 31. Dez 2014 12:17

SharedActivity.getWindow.setFlags bringt immer Exception
 
Ich versuche schon seit einiger Zeit, unter Android Flags zu setzen bzw. resetten.
Hier meine Zeilen.

Delphi-Quellcode:
try

    SharedActivity.getWindow.setFlags(
    TJWindowManager_LayoutParams.JavaClass.FLAG_SHOW_WHEN_LOCKED,
    TJWindowManager_LayoutParams.JavaClass.FLAG_SHOW_WHEN_LOCKED);

  except
    ShowMessage('Exception');
  end;
Das Programm läuft dann immer in den except Zweig.
Zum Test habe ich mal alle Berechtigungen gesetzt, die es in XE5 gibt, aber auch hier läuft es in den except Zweig, was für mich bedeutet, dass irgendetwas nicht korrekt aufgerufen wurde. Ähnliche Beispiele im Netz machen das aber auch genau so.
Was mache ich falsch?

Sir Rufo 31. Dez 2014 12:49

AW: SharedActivity.getWindow.setFlags bringt immer Exception
 
Welche Exception kommt denn nun da an?

(Über das Exception-Handling habe ich mich ja schon mehrfach ausgelassen, und das hier ist der Ober-NoGo :wall:)

Lass doch diesen
Delphi-Quellcode:
try except
komplett weg. Es passiert das Gleiche mit mehr Information.

zeras 31. Dez 2014 13:09

AW: SharedActivity.getWindow.setFlags bringt immer Exception
 
Danke für die Hinweise.

Nun habe ich eine Meldung:

Only the original thread that created a view herarchy can touch its views.

Aber was fange ich damit an?

Sir Rufo 31. Dez 2014 13:24

AW: SharedActivity.getWindow.setFlags bringt immer Exception
 
Zitat:

Zitat von zeras (Beitrag 1285061)
Danke für die Hinweise.

Nun habe ich eine Meldung:

Only the original thread that created a view herarchy can touch its views.

Aber was fange ich damit an?

Nun ja, wenn du das bei Google eingibst, dann bekommst du wesentlich mehr qualifizierte Treffer als bei der Suche nach "Exception", gelle?

Also schon einen wesentlichen Schritt weiter.

Selbst ohne Suche sieht man aber auch schon, dass du diesen Aufruf im falschen TreadKontext aufrufst. AFAIK ist bei Android der MainThread-Kontext <> dem Android-UIThread-Kontext. Von daher musst du dir etwas suchen, um auf diesen Thread-Kontext zu gelangen.

zeras 31. Dez 2014 13:42

AW: SharedActivity.getWindow.setFlags bringt immer Exception
 
Zitat:

Zitat von Sir Rufo (Beitrag 1285062)
Selbst ohne Suche sieht man aber auch schon, dass du diesen Aufruf im falschen TreadKontext aufrufst. AFAIK ist bei Android der MainThread-Kontext <> dem Android-UIThread-Kontext. Von daher musst du dir etwas suchen, um auf diesen Thread-Kontext zu gelangen.

Das ist nun die nächste harte Nuss zum knacken, aber google wird mir da schon Hinweise bringen.

Die snippets, die ich mir dazu gesucht hatte, geben keinen Hinweis auf diese "Falle". Da hätte aber jeder drüber stolpern müssen.

Danke nochmal. Wenn Stadthagen nicht so weit weg wäre, würde ich dir mal eine Flasche Sekt vorbeibringen.

Bernhard Geyer 31. Dez 2014 14:18

AW: SharedActivity.getWindow.setFlags bringt immer Exception
 
Hier ist ein Beispiel das die Lösung Zeigt: http://blog.marcocantu.com/blog/2014...d_threads.html

Sir Rufo 31. Dez 2014 14:58

AW: SharedActivity.getWindow.setFlags bringt immer Exception
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1285065)
Hier ist ein Beispiel das die Lösung Zeigt: http://blog.marcocantu.com/blog/2014...d_threads.html

Hmmm, ich würde sagen, nicht wirklich, denn der MainThread-Kontext ist ungleich dem Android-UI-Thread-Kontext!

Ich würde das eher mit den Routinen aus der
Delphi-Quellcode:
FMX.Helpers.Android
versuchen.
Natürlich steht davon nichts in der Dokumentation - ist halt sehr unwichtig
Delphi-Quellcode:
unit FMX.Helpers.Android;
...
procedure CallInUIThread(AMethod: TMethodCallback); overload;
procedure CallInUIThread(AMethod: TCallBack); overload;
procedure CallInUIThreadAndWaitFinishing(AMethod: TMethodCallback); overload;
procedure CallInUIThreadAndWaitFinishing(AMethod: TCallBack); overload;
Oder im ganzen Satz
Delphi-Quellcode:
CallInUIThreadAndWaitFinishing(
  procedure
  begin
    SharedActivity.getWindow.setFlags(
      TJWindowManager_LayoutParams.JavaClass.FLAG_SHOW_WHEN_LOCKED,
      TJWindowManager_LayoutParams.JavaClass.FLAG_SHOW_WHEN_LOCKED );
  end );


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:51 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