startActivityForResult,结果不在主线程内

时间:2016-09-23 09:15:42

标签: android multithreading delphi delphi-10.1-berlin

我正在使用Delphi 10.1 Berlin。

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 messagesdoiventêtreaffichésdansle thread principal de l'interface utilisateur'

     

'必须从用户界面主线程'

显示消息

1 个答案:

答案 0 :(得分:0)

我再次从XE7复制粘贴原始代码,但它仍然无法正常工作("您必须显示来自主线程的消息")

我在不同的地方再次测试TThread.Synchronize(nil, proc);,应用程序始终是无法解决的特技。

然后在不同的地方再次使用TThread.Queue(nil, proc);进行测试,直到它最终只包含对TDialogServiceAsync的调用。

我终于找到了一个解决方案,但是这个处理程序就像一个需要仅为消息同步的线程,但是不需要同步来创建一个新的Activity并显示它,这有点令人不安!

如果有人可以就此提供解释,请随意添加一个我很乐意接受的答案。