【问题标题】:How to debug onDestroy(), Android system kills app while paused in debugger如何调试onDestroy(),Android系统在调试器中暂停时杀死应用程序
【发布时间】:2012-12-25 02:25:11
【问题描述】:

我有一个错误,我正在尝试分析在点击后退按钮后调用 Activity 的 onDestroy() 方法时发生的错误。我在有问题的代码中放置了断点(使用 Eclipse)。调试器会在断点处暂停应用程序,但 Android 系统也会将应用程序从屏幕上移开并返回到手机的主屏幕。应用暂停大约 10 秒后,由于调试器突然断开,应用的线程似乎被 Android 系统破坏了。

关于如何防止 Android 系统这样做的任何想法?我需要保持应用程序处于活动状态,以便我可以进入调试器、查看变量等。

手机运行的是 Android 2.3.5。

【问题讨论】:

  • 不是你要找的答案,而是android.util.Log
  • 如果你在 onDestroy 中做的工作足够多,以至于你需要一个调试器,那已经是个问题了。
  • 在大多数移动框架上,无论是否完成清理,系统都会在一段时间后杀死应用程序。我怀疑你可以在股票系统上禁用它。只需按照建议使用 Log 和 logcat。
  • 不,这是最好的帮助。 onDestroy 不应该做任何资源密集型的事情。如果它所做的不仅仅是释放资源,那么您的架构就是错误的。如果你需要一个调试器来解决你有崩溃行号的空指针问题,你需要提高你的调试技能。调试器适用于具有大量移动部件的复杂问题,如果您针对每个问题都使用它,您将永远不会学会如何批判性地思考或调试复杂问题。更不用说仅仅添加 3 或 4 条日志语句比来这里要快一个数量级。
  • @GabeSechan,我在 Stackoverflow 上发布了部分内容,以便其他面临相同问题的人找到解决方案。此外,您是否想过这是一个错误,而不是架构决策,onDestroy() 中发生了很多事情。错误是关闭的网络连接触发观察者触发,触发应用程序中的其他代码运行。只需在 onPause() 中取消注册观察者即可。

标签: android debugging


【解决方案1】:

我发现的一种解决方法是将startActivity() 调用放入onDestroy()(在super.onDestroy() 之前),以启动Activity 的虚拟实例,以保持应用程序处于活动状态。 Android 系统不会对应用线程进行垃圾回收,因为其中仍有一个 Activity 正在运行(新的虚拟 Activity)。这反过来又允许您调试事物,因为调试器与线程的连接不会丢失。

如果手机弹出一个对话框说应用程序没有响应(强制关闭或等待),不要点击等待,不要理会它。似乎单击 Wait 会导致应用线程被终止,并为虚拟 Activity 创建了一个新线程。

【讨论】:

    【解决方案2】:

    您可以尝试在super.onDestroy() 上设置断点,但我怀疑您也会有同样的运气。 :(

    Android 不会让您在onDestroy 中逗留,它会超时,因此请尝试更快地完成关机。 onDestroy() 仅用于释放资源,并不总是在终止前调用;数据应保存在onPause()onStop() 中。 https://developer.android.com/training/basics/activity-lifecycle/stopping.html

    附录:其他选项包括为某些工作使用后台服务或手动处理后退按钮以给自己更多时间,但这可能会对用户体验产生负面影响。

    http://www.stanford.edu/class/cs193a/03/

    从我的手机发送,请放宽我的拇指。

    【讨论】:

    • 并没有真正回答所问的问题。他问如何才能延长调试时间……
    • 调试器正在尝试在 onDestroy 中暂停应用程序,但 afaik Android 将简单地停止该过程。将所有内容从 onDestroy 移动到 onPause 有点麻烦,但应该可以可靠地工作。
    猜你喜欢
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多