【问题标题】:Is ondestroy not always called?不总是调用 ondestroy 吗?
【发布时间】:2013-11-05 16:47:23
【问题描述】:

我在我的活动的onDestroy 中放置了一些缓存清理代码,但大多数情况下,除非我通过finish() 明确完成活动,否则代码不会执行。

编辑:刚刚阅读 onDestroy 仅在 finish() 或系统资源不足时调用。那么我需要把我的缓存清理代码放在哪里呢?如果我把它放在onPause() 并且用户返回应用程序,缓存就会被清除。我实际上将重要的临时文件存储在缓存中,不应在onPause 中删除。

【问题讨论】:

    标签: android ondestroy


    【解决方案1】:

    来自Android开发者documentation

    protected void onDestroy ()

    在 API 级别 1 中添加 在活动开始之前执行任何最终清理 被摧毁。这可能是因为活动正在结束 (有人叫finish()就可以了,或者因为系统暂时 销毁该活动实例以节省空间。你可以 用 isFinishing() 方法区分这两种情况。

    注意:不要指望调用此方法作为保存位置 数据!例如,如果活动正在编辑内容中的数据 提供者,这些编辑应该在 onPause() 或 onSaveInstanceState(Bundle),不在这里。这种方法通常 实现释放资源,如与 活动,以便被破坏的活动不会留下这样的东西 在其应用程序的其余部分仍在运行时。有 系统将简单地终止活动托管的情况 处理而不在其中调用此方法(或任何其他方法),因此它 不应该被用来做打算留在身边的事情 进程结束后。

    您可以将代码移至onPause()onStop()

    【讨论】:

    • 我将调整大小的图像存储在缓存中。如果我刷新它 onstop()/onpause() 并且应用程序恢复,我调整大小的图像将丢失。我应该再次调整它们的大小吗?这非常消耗资源
    • 保存图片很简单onStop() 然后加载它们onStart()
    • 我将调整大小的图像存储在临时缓存文件夹中...用户可以单击按钮保存图像或使用后退按钮离开应用程序...问题是我想要仅在他离开我的应用程序时清理/擦除调整大小的图像
    • ok onPause 在活动对用户不可见时被调用,因此您可以将代码放在那里,然后在 onResume 上恢复它。
    • 所以你说我删除onPause 中所有调整大小的图像并在onResume 中重新创建它们?可能会发生 500 张图片.....每次调整它们的大小都需要一些时间,这对 imo 来说并不是真正的用户友好
    【解决方案2】:

    尝试使用onstop

    喜欢这个

    @Override
        protected void onStop() {
            super.onStop();
           //write your code here
        }
    

    【讨论】:

    • 但问题是为什么不总是调用 onDestroy?
    【解决方案3】:

    ondestroy 通常在系统完全从内存中删除活动时调用,或者当用户终止活动时,您希望在暂停时保存数据,因为它总是在销毁之前调用。

    【讨论】:

    • onDestroy() 在强制关闭的情况下不会被调用。
    • 通过刷出最近的应用程序删除应用程序时也不会调用它。至少在大多数情况下,有时它会触发。我真的很想知道这个回调到底应该包含什么。
    • 你说得对,很奇怪。 “这是在活动被杀死之前清理资源的任何入口点 - 也许”。
    猜你喜欢
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多