Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
应用程序isn';t响应-Delphi XE6-Android_Android_Delphi_Mobile_Delphi Xe6_Android Anr Dialog - Fatal编程技术网

应用程序isn';t响应-Delphi XE6-Android

应用程序isn';t响应-Delphi XE6-Android,android,delphi,mobile,delphi-xe6,android-anr-dialog,Android,Delphi,Mobile,Delphi Xe6,Android Anr Dialog,在Android上,当我在点击15秒后的长时间功能(所需时间>30秒)中触摸屏幕时,会出现一条消息“应用程序没有响应”。 我不想看到它 我做了一个测试项目,有两个按钮和一个函数“LongProcess”来模拟一个长过程(只需30秒的睡眠时间)。我的第一个按钮“LaunchFunction”只是调用函数。我的第二个按钮“LaunchThread”,启动一个执行我的“LongProcess”的线程。 在第一种情况下,我有问题,但在第二种情况下,它工作得很好(消息永远不会出现,因为我的主窗体没有等待

在Android上,当我在点击15秒后的长时间功能(所需时间>30秒)中触摸屏幕时,会出现一条消息“应用程序没有响应”。 我不想看到它

我做了一个测试项目,有两个按钮和一个函数“LongProcess”来模拟一个长过程(只需30秒的睡眠时间)。我的第一个按钮“LaunchFunction”只是调用函数。我的第二个按钮“LaunchThread”,启动一个执行我的“LongProcess”的线程。 在第一种情况下,我有问题,但在第二种情况下,它工作得很好(消息永远不会出现,因为我的主窗体没有等待)

然而,我必须等待“长流程”的结束(因此线程的结束),因为我必须在它之后做其他需要“长流程”结果的事情。所以我试着用很多方法来等待我的线程。我尝试使用TThread类的“WaitFor”,但它重复了最初的问题。我也试着用一个简单的“while”

但它是一样的,如果我触摸屏幕,弹出窗口将再次出现。 关键部分而不是“while”或“Thread.WaitFor”做了完全相同的操作

因此,我尝试在我的“while”中更新GUI,以便向Android显示应用程序正在工作

while not fThread.Finished do
begin
  Sleep(100);
  Label_Test.Text := 'Msg' + IntToStr(i);
  Inc(i);
  Application.ProcessMessages;
end; 
我看到我的标签值改变,如果我触摸屏幕,没有任何变化。15秒后,我将弹出窗口(但我仍会看到我的标签在后台更新)

有人有主意吗?也许我们可以在一个漫长的过程中禁用该事件(这样,点击将不在队列中,所以他不应该被认为在15秒后“没有响应”)。Application.ProcessMessage在Android上似乎不起作用。 或者Android API中存在某种东西,比如说我们没有处于非活动状态

对于finish,如果我点击“Wait”,应用程序将完美地工作。如果我不触摸屏幕(也没有线程,直到我不触摸屏幕),但我看到很多用户像机器人一样点击“OK”(这关闭了ofc的应用程序…)。谢谢你将来的帮助

ps:我试着用定时器替换线程,因为我在论坛上看到了它,但它什么也没改变


ps2:这里是一个.zip或演示项目

如果你阻塞主线程太长时间,你会得到一个ANR。这是没有办法的。不要试图让你的应用程序等待。只需在长流程结束时在单独的线程中启动“其他事情”


你可以试着用定时器来操作它,但那将是一件非常愚蠢的事情,安卓系统总体速度很慢,但这是你的错误。你所尝试的方式真的没有办法解决。您可以尝试为线程声明OnTerminate事件,以通知主线程工作已完成,或者在不使用Sleep()的情况下找到其他方法。

如果您将睡眠(nnn)放入主线程,则将LongProcess()放入单独的线程毫无意义。如果您将主线程阻塞太长时间,则会得到ANR。这是没有办法的。不要试图让你的应用程序等待。只需在长流程结束时在单独的线程中启动“其他事情”。软件流必须是事件驱动的。不要在主线程中等待长线程任务完成。相反,为线程声明一个
OnTerminate
事件,以通知主线程工作已完成。是的,但是如果我将“LongProcess”和以下处理放在线程上,如何禁用用户的单击,直到线程结束?我应该禁用所有可点击的项目吗?没有简单或灵活的解决方案?在线程启动之前禁用按钮,然后在线程的onterminate方法中重新启用按钮。
while not fThread.Finished do
begin
  Sleep(100);
  Label_Test.Text := 'Msg' + IntToStr(i);
  Inc(i);
  Application.ProcessMessages;
end;