Delphi 10.1 ベルリンを使用しています。
XE7 ではすべて問題ありませんでした。
アクティビティを開始すると、結果がスレッド内で処理されるようになり、同期/キューがアプリケーション全体をハングさせます。TDialogServiceAsync.InputQuery を表示する必要があるため、同期しないと、メイン スレッドからメッセージを表示する必要があるという例外が発生します (これは XE7 で完全に機能していました)。
これは、「機能していた」単純化されたコードです(テスト済み):
電話 :
FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage(
TMessageResultNotification, HandleActivityMessage);
intnt := TJIntent.JavaClass.init;
intnt.setAction(StringToJString('com.domain.mylib.MYCLASS'));
intnt.setPackage(StringToJString('com.domain.mylib'));
TAndroidHelper.Activity.startActivityForResult(intnt, REQUEST_CODE);
ハンドラー:
HandleActivityMessage(const Sender: TObject; const M: TMessage);
begin
// I tried TThread.Sync/Queue here... Hang
if M is TMessageResultNotification then
begin
OnActivityResult(
TMessageResultNotification(M).RequestCode,
TMessageResultNotification(M).ResultCode,
TMessageResultNotification(M).Value
);
end;
end;
OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent);
var
Values: array of String;
begin
if (RequestCode = REQUEST_CODE) and (ResultCode = TJActivity.JavaClass.RESULT_OK) then
begin
//Either
TDialogServiceAsync.ShowMessage('...');
// Or
SetLength(Values, 1);
Values[0] := '';
TDialogServiceAsync.InputQuery('something', ['info'], Values, Self.OnInputQuery2_Close);
end;
end;
この例外を除いて (オリジナルと翻訳...):
「Les messages doivent être affichés dans le thread principal de l'interface utilisateur」
「メッセージはユーザー インターフェイスのメイン スレッドから表示する必要があります」