0

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」

「メッセージはユーザー インターフェイスのメイン スレッドから表示する必要があります」

4

1 に答える 1

0

XE7 の元のコードを再度コピーして貼り付けましたが、まだ機能しませんでした (「メイン スレッドからメッセージを表示する必要があります」)。

さまざまな場所で再度テストしTThread.Synchronize(nil, proc);ましたが、アプリケーションは常に取り返しのつかないほど機能しませんでした。

次にTThread.Queue(nil, proc);、 への呼び出しのみをラップして最終的に機能するまで、別の場所で で再度テストしましたTDialogServiceAsync

私は最終的に解決策を見つけましたが、このハンドラーは、メッセージに対してのみ同期する必要があるスレッドのように機能しますが、新しいアクティビティを作成して表示するために同期する必要はありません。

誰かがその点について説明できる場合は、解決策として喜んで受け入れる回答を自由に追加してください.

于 2016-10-03T15:08:31.173 に答える