我正在使用Delphi 10.1柏林。startActivityForResult,結果不在主線程內
一切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;
與此異常(原件和翻譯......):
「萊斯消息doivent理由affichés丹斯樂線程主要DE L'接口utilisateur」
預先感謝任何幫助,柏林新的行爲是非常奇怪... – Darkendorf
'先感謝您的任何help'。我們不想要。當你得到幫助時,我們希望得到明確的感謝。 – greenapps
似乎有點好奇......我有一個應用程序使用這種機制來響應ZXing掃描條形碼。在消息管理器調用的例程中,在'TThread.Queue'調用中有一個'TDialogService.MessageDialog'調用。將其更改爲「TDialogServiceAsync.MessageDialog」並重新運行消息框仍然彈出可讀,並且可以被接受地解僱。我的'TThread.Queue'在'TMainForm.OnActivityResult'方法中。 – blong