2016-09-23 96 views
0

我正在使用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」

+0

預先感謝任何幫助,柏林新的行爲是非常奇怪... – Darkendorf

+0

'先感謝您的任何help'。我們不想要。當你得到幫助時,我們希望得到明確的感謝。 – greenapps

+0

似乎有點好奇......我有一個應用程序使用這種機制來響應ZXing掃描條形碼。在消息管理器調用的例程中,在'TThread.Queue'調用中有一個'TDialogService.MessageDialog'調用。將其更改爲「TDialogServiceAsync.MessageDialog」並重新運行消息框仍然彈出可讀,並且可以被接受地解僱。我的'TThread.Queue'在'TMainForm.OnActivityResult'方法中。 – blong

回答

0

我「的郵件必須從用戶界面的主線程來顯示」再次複製粘貼原代碼從XE7,它仍然無法正常工作(「您必須顯示來自主線程的消息」)

我在不同的地方再次測試TThread.Synchronize(nil, proc);,並且應用程序總是不可收拾的特技。

然後在不同的地方再次用TThread.Queue(nil, proc);進行測試,直到它最後只能打電話給TDialogServiceAsync

我終於找到了一個解決方案,但此處理工作一樣,需要一個線程只能同步的消息,但並不需要創建一個新的活動,並顯示它同步,是一種令人不安的!

如果有人可以給我在這一點上的解釋,隨意添加一個答案,我會欣然接受的解決方案。

相關問題