为什么我的Android应用突然退出?

时间:2017-09-29 16:47:23

标签: android delphi firemonkey

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

1 个答案:

答案 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将无关紧要。