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

AsyncTask.execute() runs callback after onDestroy is called

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

我的疑问是如何处理方向变化。当方向改变时,

我的问题是

  1. 我应该停止 AsyncTaskonDestroy 方法中执行吗
  2. 如果不是,在数据库save/update/delete完成之前Activity被销毁,我该如何处理?

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

activity 中的 AsyncTask 可能不是 运行 后台任务的最佳解决方案,因为它持有对现在已销毁的 activity 的引用。

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

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

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

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

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