【问题标题】:saving data safely before Activity is destroyed在 Activity 被销毁之前安全保存数据
【发布时间】:2015-05-18 06:05:19
【问题描述】:

当用户关闭我的应用程序时,我需要保存一些至关重要的数据。我更喜欢在ActivityonPause() 中执行此操作,因为它是保证在应用程序被销毁之前调用的最新方法,无论其销毁的原因是什么。但是,我将数据保存在数据库中,所以我使用AsyncTask。从我的AsyncTask,完成后,我在我之前保存在AsyncTask 中的Activity 引用上调用回调方法,我将一些变量放入SharedPreferences,表明数据已成功放入数据库.

我的问题是:AsyncTask 是否保证完成,并且在活动的Activity 引用被销毁之前调用回调?如果没有,如何确保在Activity被销毁之前将数据写入数据库?

【问题讨论】:

  • 您之前尝试过任何代码吗?如果是这样,请在这里给我代码,我会告诉你问题
  • 这不是问题。我只是在问一个关于应用程序行为的技术问题。我的问题中描述了这种情况。

标签: android android-asynctask activity-lifecycle


【解决方案1】:

您无需实现CallBack 方法来保存您已更新DatabaseSharedPreferences

如果你真的需要一个数据库来保存你的信息,你可以简单地在你的 SharedPreferences 中创建一个名为 isDataExistToLoad

的标志

此标志最初必须是 False,在将您的信息存储到数据库中的 Thread 中,将其设置为 True

public void updateUserStatus(ArrayList<Object> data){
    try{
         DBController.save(data);
         SharedPReferencesController.setDataExistToLoad(true);
    }catch(Exception e){
         e.printStackTrace();
         SharedPReferencesController.setDataExistToLoad(false);
    }
}

每当您打开应用时,请检查此标志。如果是True,则从数据库中加载,然后将其设置为False。如果是False,则保持原样,因为之前的事务没有成功完成。

我的问题是: AsyncTask 保证完成并且回调 在活动的活动引用被销毁之前被调用? 如果没有,如何确保在Activity之前将数据写入数据库 被毁了?

我的回答是: AsyncTask 的一部分在一个单独的线程中运行,即 DoInBackground,您无法确保 Activity 在完成之前仍然存在。如果您尝试在完成后台线程工作后在 UITread 上运行的 postExcute() 中执行任何其他任务。您的应用程序可能会崩溃。这就是为什么我不建议这样做。

【讨论】:

  • 我需要成功完成所有交易,这就是我写这个问题的原因。
  • 将存储您的数据的方法Save 应该Throw 异常以防发生任何故障。这样,您将确保所有交易都已成功完成。 @Salivan
  • 但在我的情况下,回调是一个非常舒服的想法。我只需要有人告诉我Activity 是否会在AsyncTask 完成之前继续存在,这样我就可以确定回调被调用了。
  • @Salivan AsyncTask 的一部分在单独的 Thread 中运行,即 DoInBackground,您无法确保在 UITread 上运行的 Activity will still be survived. If you tried to perform any other task in postExcute()`。您的应用程序可能会崩溃。这就是我不建议这样做的原因。
  • @Salivan 当您使用Try/Catch 并在Try 末尾编辑首选项时,这将确保在编辑首选项之前必须成功完成所有先前的代码,没有任何异常:)
【解决方案2】:

ASyncTask 在后台与主线程并行执行。如果 Activity 关闭,ASyncTask 仍然会继续执行直到结束。并且它不需要将控制权返回给主进程。

所以,你肯定可以在关闭应用程序之前使用这种保存数据的方法。

我不确定在 onPause 的 Activity 之后(即,当调用 onPause() 回调时)您是否可以使用 share-preference 功能。因此,您应该在后退按钮或onCreate()中的某些事件上处理它

【讨论】:

  • 我知道你的意思,但我想知道ActivityAsyncTask 执行时是否存在以及是否会调用回调。
  • 当你关闭活动时,活动被销毁,但 ASyncTask 继续执行直到结束。
  • 不,Activity 被销毁时不会存活,即使这样 ASyncTask 会继续执行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多