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

Android AsyncTask.execute()在调用onDestroy后运行回调,android,sqlite,android-activity,android-asynctask,activity-lifecycle,Android,Sqlite,Android Activity,Android Asynctask,Activity Lifecycle,我正在将onPause方法上的数据保存到SQLite数据库 我调用myObject.saveEntry(数据) 它通过调用AsyncTask.execute(newrunnable(){}) 保存数据后,将调用回调方法savedSuccess(message) 调用活动方法showMessage(message) 此时会显示一个祝酒词,表示数据已成功保存 我的疑问是如何处理方向的变化。当方向改变时 调用onPause,并调用saveEntry方法 然后调用ondestory 将再次创建活动

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

  • 我调用
    myObject.saveEntry(数据)
  • 它通过调用
    AsyncTask.execute(newrunnable(){})
  • 保存数据后,将调用回调方法
    savedSuccess(message)
  • 调用
    活动
    方法
    showMessage(message)
  • 此时会显示一个祝酒词,表示数据已成功保存
我的疑问是如何处理方向的变化。当方向改变时

  • 调用
    onPause
    ,并调用
    saveEntry
    方法
  • 然后调用
    ondestory
  • 将再次创建活动的新实例
  • 现在执行
    savedSuccess(message)
    方法回调(从活动的上一个实例调用)
  • showMessage(message)
    被调用并显示toast
我的问题是

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

  • 如果将
    AsyncTask
    放在一个保留的片段中,则它可以在方向更改后存活。看见如果希望任务在活动完成或进入后台时继续存在,请将其放入
    服务中

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

    可以考虑使用StestRealStaseTrue(TRUE)使用一个片段来使用AcycTebug或ItTunService进行后台工作。


    有关如何使用任务片段进行后台工作的信息,请参阅。

    您看到的是内存泄漏-异步任务保留对其声明的活动的引用,并阻止Android运行时对其进行垃圾收集。回答您的问题:

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

  • 您可以选择使用静态嵌套AsyncTask,该任务将不包含对其所在活动的引用-需要注意的是,您将无法引用活动中的任何内容,但对于您的案例来说,这应该不是一个大问题


  • 了解并改用加载器。如果您正确地编码,它们将在活动生命周期中生存。