AsyncTask.execute() 在调用 onDestroy 后运行回调
AsyncTask.execute() runs callback after onDestroy is called
我正在将 onPause
方法上的数据保存到 SQLite
数据库。
- 我打电话给
myObject.saveEntry(data)
。
- 通过调用
AsyncTask.execute(new Runnable(){})
保存数据
- 保存数据后,调用回调方法
savedSuccess(message)
- 调用了一个
Activity
方法showMessage(message)
- 提示信息保存成功
我的疑问是如何处理方向变化。当方向改变时,
调用 onPause
并调用 saveEntry
方法。
- 之后调用
onDestroy
- 再次创建 Activity 的 新实例 。
- 现在执行
savedSuccess(message)
方法回调(这是从 Activity 的前一个实例调用的)
showMessage(message)
被调用并显示 toast
我的问题是
- 我应该停止
AsyncTask
在 onDestroy
方法中执行吗
- 如果不是,在数据库save/update/delete完成之前Activity被销毁,我该如何处理?
如果您将 AsyncTask
放入保留的片段中,它可以在方向更改后继续存在。参见 Handling Configuration Changes with Fragments。如果您希望任务在 activity 完成或进入后台堆栈时继续存在,请将其放入 Service
.
activity 中的 AsyncTask 可能不是 运行 后台任务的最佳解决方案,因为它持有对现在已销毁的 activity 的引用。
您可以考虑使用带有 setRetainInstance(true) 的片段来使用 AsyncTask 或 IntentService 进行后台工作。
请参阅 here 了解如何使用任务片段进行后台工作。
您看到的是内存泄漏 - AsyncTask 保留对它在其中声明的 Activity 的引用,并阻止 Android 运行时对其进行垃圾回收。回答您的问题:
无法使用命令停止 AsyncTask。您可以在 onDestroy() 中请求取消它,但只有在 doInBackground() 方法执行后它仍然会执行,在您的情况下将是 Runnable。
您可以选择使用静态嵌套 AsyncTask,它不会保存对它所在的 Activity 的引用 - 需要注意的是您将无法引用任何内容Activity 但这对你的情况来说应该不是什么大问题。
我正在将 onPause
方法上的数据保存到 SQLite
数据库。
- 我打电话给
myObject.saveEntry(data)
。 - 通过调用
AsyncTask.execute(new Runnable(){})
保存数据
- 保存数据后,调用回调方法
savedSuccess(message)
- 调用了一个
Activity
方法showMessage(message)
- 提示信息保存成功
我的疑问是如何处理方向变化。当方向改变时,
-
调用
onPause
并调用saveEntry
方法。- 之后调用
onDestroy
- 再次创建 Activity 的 新实例 。
- 现在执行
savedSuccess(message)
方法回调(这是从 Activity 的前一个实例调用的) showMessage(message)
被调用并显示 toast
我的问题是
- 我应该停止
AsyncTask
在onDestroy
方法中执行吗 - 如果不是,在数据库save/update/delete完成之前Activity被销毁,我该如何处理?
如果您将 AsyncTask
放入保留的片段中,它可以在方向更改后继续存在。参见 Handling Configuration Changes with Fragments。如果您希望任务在 activity 完成或进入后台堆栈时继续存在,请将其放入 Service
.
activity 中的 AsyncTask 可能不是 运行 后台任务的最佳解决方案,因为它持有对现在已销毁的 activity 的引用。
您可以考虑使用带有 setRetainInstance(true) 的片段来使用 AsyncTask 或 IntentService 进行后台工作。
请参阅 here 了解如何使用任务片段进行后台工作。
您看到的是内存泄漏 - AsyncTask 保留对它在其中声明的 Activity 的引用,并阻止 Android 运行时对其进行垃圾回收。回答您的问题:
无法使用命令停止 AsyncTask。您可以在 onDestroy() 中请求取消它,但只有在 doInBackground() 方法执行后它仍然会执行,在您的情况下将是 Runnable。
您可以选择使用静态嵌套 AsyncTask,它不会保存对它所在的 Activity 的引用 - 需要注意的是您将无法引用任何内容Activity 但这对你的情况来说应该不是什么大问题。