调用onDestroy后,AsyncTask.execute()运行回调

时间:2016-03-03 17:30:56

标签: android sqlite android-activity android-asynctask activity-lifecycle

我将onPause方法的数据保存到SQLite数据库。

  • 我致电myObject.saveEntry(data)
  • 通过调用AsyncTask.execute(new Runnable(){})
  • 来保存数据
  • 保存数据后,将调用回调方法savedSuccess(message)
  • Activity方法showMessage(message)称为
  • 显示Toast表示数据已成功保存

我怀疑如何处理方向变化。当方向改变时,

    调用
  • onPause并调用saveEntry方法。
  • 之后调用onDestroy
  • 再次创建活动的新实例
  • 现在执行savedSuccess(message)方法回调(从前一个Activity实例调用)
  • 调用
  • showMessage(message)并显示toast

我的问题是

  1. 我应该停止AsyncTask方法执行onDestroy
  2. 如果没有,在数据库保存/更新/删除完成之前,如何在销毁活动时处理这种情况?

3 个答案:

答案 0 :(得分:2)

活动中的AsyncTask可能不是运行后台任务的最佳解决方案,因为它包含对活动的引用,该活动现在已被销毁。

您可以考虑使用带有setRetainInstance(true)的Fragment来使用AsyncTask或IntentService进行后台工作。

请参阅here了解如何使用任务片段进行后台工作。

答案 1 :(得分:1)

如果将AsyncTask放入保留的片段中,则Service可以保留方向更改。见Handling Configuration Changes with Fragments。如果您希望任务在活动完成或进入后台堆栈时生存,请将其放入cv.h

答案 2 :(得分:1)

您所看到的是内存泄漏 - AsyncTask保留对其声明的Activity的引用,并阻止Android运行时垃圾收集它。回答你的问题:

  1. 无法使用命令停止AsyncTask。您可以请求在onDestroy()中取消它,但它仍然只在执行了doInBackground()方法后执行,在您的情况下将是Runnable。

  2. 您可以选择使用静态嵌套的AsyncTask,它不会保存对它所驻留的Activity的引用 - 需要注意的是,您将无法引用Activity中的任何内容,但不应该对你的案子来说是个大问题。