在销毁活动之前安全地保存数据

时间:2015-05-18 06:05:19

标签: android android-asynctask activity-lifecycle

当用户关闭我的应用时,我需要保存一些至关重要的数据。我倾向于在Activity的{​​{1}}中执行此操作,因为它是在应用程序被销毁之前保证被调用的最新方法,无论其被破坏的原因是什么。但是,我将数据保存在数据库中,所以我使用onPause()。从我的AsyncTask开始,当我完成后,我在AsyncTask引用上调用了一个回调方法,我之前保存在Activity中,我将一些变量放到AsyncTask表示数据已成功放入数据库。

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

2 个答案:

答案 0 :(得分:1)

您不需要实施CallBack方法来保存已更新SharedPreferences的{​​{1}}。

您可以简单地说,如果您确实需要一个数据库来存储您的信息,请在Database中创建一个名为 isDataExistToLoad 的标记

此标记最初必须为SharedPreferences,并且在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则保持原样,因为之前的交易未成功完成。

  

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

我的答案是: False的一部分在一个单独的线程中运行,该线程是DoInBackground,您无法确保该活动在完成之前仍然存活。如果您尝试在完成后台线程工作后在{JITread上运行的AsyncTask中执行任何其他任务。您的应用可能会崩溃。这就是我不推荐的原因。

答案 1 :(得分:1)

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

因此,您可以在关闭应用程序之前使用这种保存数据的方法。

我不确定在活动的ASyncTask之后(即,当调用onPause回调时),您可能能够使用onPause()功能。因此,您应该在后台按钮或share-preference

中的某个事件处理它