我正在使用Delphi 10.2创建Android应用程序,该应用程序使用Rest组件从post表单中读取返回的数据。当我按下按钮加载数据时,它会在大约3秒钟冻结后正常加载。问题是,如果用户尝试点击(或触摸)应用程序在3秒冻结后立即退出的任何控件,但如果用户没有触摸应用程序数据已正常加载!
这是什么原因以及我应该如何解决?
我用于按钮的代码是
RESTRequest1.Execute;
我使用3个组件RESTClient,RESTRequest和RESTResponse
这是我用来获取数据的代码:
procedure TfrmMain.RESTRequest1AfterExecute(Sender: TCustomRESTRequest);
var
return_response: string;
begin
if RESTResponse1.StatusCode = 200 then begin
//fill years
return_response := RESTResponse1.Content;
memo1.text := return_response;
end;
end.
答案 0 :(得分:7)
在移动平台上,您应始终使用ExecuteAsync
,因为它 在与UI相同的线程中运行。 Execute
代替在UI的相同主题上运行,因此在处理请求时会冻结。如果几秒钟后Android没有响应(=冻结),Android会关闭应用程序,这就是你的问题!
更确切地说,这是doc:
强烈建议在移动设备上使用ExecuteAsync方法 平台。 iOS(可能是Android)将终止应用程序 它认为主线程没有响应,即如果正在运行 请求需要一两秒钟才能返回
您可以找到更多信息here。
正如您在文档中看到的,函数ExecuteAsync
有一个有用的参数,它采用匿名过程。 ExecuteAsync
完成任务后,将调用此过程的代码。这是一个例子:
RESTRequest1.ExecuteAsync(
procedure
begin
ShowMessage('Finished!');
end;);
这非常简单,您也不需要输入其他参数,因为默认情况下它们会有一个值。同样,如果您查看您将看到的文档ASynchronized: Boolean = True;
,那么将匿名proc之后的第二个参数设置为True将无关紧要。