Android应用程序死于"启动超时已过期,放弃唤醒锁定!"某些手机​​

时间:2015-05-20 04:53:28

标签: android android-activity timeout launch

我正在开发一款Android应用程序,它在标题屏幕上显示连续的自定义渲染动画,因此在加载完成后无法真正进入空闲状态。在我测试过的大多数设备上,一切运行良好,但三星的Galaxy S2几秒后就杀死了应用程序。我没有获得堆栈跟踪或我放入System.out事件处理程序和onPausedefault uncaught exception handler输出的任何输出,所以它似乎没有在我的代码中是正常退出或异常。

我在LogCat中获得的唯一输出如下:

Launch timeout has expired, giving up wake lock!
Sending signal. PID: 22344 SIG: 3
handleActivityTimeout pid=[22344] cnt=10
Process ... (pid 22344) has died.

此处有几个相关的帖子(1234),但它们似乎都会略微不同地引发问题(闹钟,递归循环,UI线程中的网络请求,...)。最后一个链接到Google Groups discussion,表示可以简单地忽略此错误消息。我不想采取的方法,因为它会导致我的应用程序在Galaxy S2(以及其他人?)上崩溃。

基本上我所做的是编写一个自定义View,在其onDraw()方法中呈现下一个动画帧,然后在从onDraw()返回之前调用postInvalidate()。如果重要:我的第一个postInvalidate()调用发生在onCreate(...)期间。

渲染非常快,在该设备上以每秒40帧以上的速度运行,在更现代的手机上以超过60帧的速度运行。因此,控制可以非常频繁地返回到事件循环,并且应用程序也非常敏感。然而,银河似乎认为它已经崩溃并杀死它(如果这甚至是我的应用程序在那里死亡的原因)。问题是:如果我足够快,可以点击我的应用程序中的菜单项,最终在没有动画的屏幕上突破"尾部递归" postInvalidate()一次,一切运行正常。即使我再次回到标题画面,动画再次运行。

所以,当然,我可能只需要使用postInvalidateDelayed(...)一次就可以打破启动检查,但这似乎是一个hacky解决方案而且我不知道是否有可能是其他设备,可能会考虑我的应用程序在稍后阶段死亡(不仅仅是在启动期间)并杀死它。

在我正在做的事情中使用postInvalidate()是否存在根本性的错误?有办法解决吗?我想避免不得不移动到一个单独的线程,因为这会打开另外一堆蠕虫,只要在UI和该线程之间来回传递事件。我知道它不会成为世界末日并使用SurfaceView,它甚至可能会带来轻微的性能提升,但从用户体验的角度来看,它实际上并不是必需的(一切都运行得很顺利),所以我想避免所涉及的额外机会(多线程很难调试)。

0 个答案:

没有答案