2

我正在将方法的数据保存到SQLite数据库。AsyncTask.execute()在调用onDestroy后运行回调

  • 我打电话给myObject.saveEntry(data)
  • 它通过调用AsyncTask.execute(new Runnable(){})
  • 一旦数据被保存的数据保存,回调方法savedSuccess(message)
  • Activity方法showMessage(message)
  • 举杯显示话说,数据保存成功

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

  • 被调用,saveEntry方法被调用。
  • onDestroy后叫
  • 一个新实例活动的再次创建。
  • savedSuccess(message)方法回调得到现在执行
  • showMessage(message)(这是从活动的前一个实例调用)被称为土司显示

我的问题是

  1. 我应该停止AsyncTask执行onDestroy方法
  2. 如果不是,在数据库保存/更新/删除完成之前活动被破坏时,我应该如何处理这种情况?
+0

了解并使用Loader代替。如果您编码属性,它们将在活动生命周期中存活。 –

回答

1

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

  1. AsyncTask不能用命令停止。你可以在onDestroy()中请求取消它,但是只有在doInBackground()方法执行完成后,它才会执行它,在你的情况下它将是Runnable。

  2. 你可以选择使用静态嵌套的AsyncTask,它不会持有对它所在活动的引用 - 警告的是,你将无法引用任何来自Activity但不应该是你的情况很大的问题。

1

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

2

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

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

有关如何使用任务片段完成后台工作,请参阅here

相关问题