在应用程序中,我有一个活动,它的启动模式为singleTask。有许多通过此活动的用例,因此它被调用的次数。通过运行monkeyrunner脚本并每隔几秒钟调用此活动来对应用程序进行压力测试会导致ANR。
我猜,它的设计方式,其中大多数用例通过此活动是不正确的,但我不能改变这个设计。
有没有什么办法可以抑制ANR?我的意思是,将UI操作添加到事件队列中,这样它就不会阻塞主UI线程,也不会产生ANR。
发布于 2014-04-29 16:15:43
从问题中不清楚你的活动是(或应该)做什么。也许你需要的是一项服务。
在后台线程中执行耗时的操作并将结果传递给UI线程是很常见的。
您可以使用类Handler/Looper (发送消息比发送消息更容易),也可以使用AsyncTask。尽管如此,这里讨论的AsyncTask仍然很棘手:Is AsyncTask really conceptually flawed or am I just missing something?。AFAIK Google试图修复典型的bug,并使新的行为与旧的行为不兼容(也就是说,我在较新的Android上看到了一些错误的行为,这可能是因为一些执行异步任务作业的版本线程在启动它们的活动从屏幕上消失后被杀死)。
我可以猜想,singleTask是你用来对抗这样一个事实的方式:当屏幕翻转时,一个活动死了,一个新的活动来了。我建议你使用单例(它们在屏幕旋转中存活,但不能在进程重启中存活,这是Android中有时会发生的另一件事)。(用户切换到Camera之类的应用程序,拍摄一张大照片,然后返回--由于Camera需要内存,活动将重新启动。我已经在实践中看到了这一点,但那一次我没有试图确定整个过程是否重新启动。)
无论如何,请添加日志记录,告诉您何时进入和离开活动,包括onNewIntent()和其他生命周期函数(为了安全起见,我建议打印线程名称)。然后,您可能会看到发生了什么。
https://stackoverflow.com/questions/23356302
复制相似问题