在 Activity 被销毁之前安全保存数据
saving data safely before Activity is destroyed
我需要在用户关闭我的应用程序时保存一些至关重要的数据。我更喜欢在 Activity
的 onPause()
中执行此操作,因为它是保证在应用程序被销毁之前调用的最新方法,无论其销毁的原因是什么。但是,我将数据保存在数据库中,所以我使用 AsyncTask
。从我的 AsyncTask
开始,当它完成时,我在我之前保存在 AsyncTask
中的 Activity
引用上调用回调方法,我将一些变量放入 SharedPreferences
以表明数据已成功放入数据库。
我的问题是: 是否保证 AsyncTask
完成并在 Activity
引用被销毁之前调用回调?如果不是,如何确保在 Activity
销毁之前将数据写入数据库?
您不需要实施 CallBack
方法来保存您已更新 Database
的 SharedPreferences
。
如果您真的需要一个数据库来存储您的信息,您可以简单地在 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
保持原样,因为之前的交易没有成功完成。
My question is: is the AsyncTask guaranteed to finish and the callback
to be called on an alive Activity reference before it gets destroyed?
If not, how to ensure that data is written to database before Activity
is destroyed?
我的答案是: AsyncTask
的一部分在一个单独的线程中运行,该线程是 DoInBackground,您不能确保 Activity 仍然存在直到完成。如果您尝试在完成后台线程工作后在 UITread 上运行的 postExcute()
中执行任何其他任务。您的应用程序可能会崩溃。这就是为什么我不推荐这样做。
ASyncTask
在后台与主线程并行执行。如果 Activity 关闭,ASyncTask
仍然会继续执行直到结束。而且不需要return控制主进程。
所以,您完全可以使用这种在关闭应用程序之前保存数据的方法。
我不确定在 Activity 的 onPause
之后(即调用 onPause()
回调时)您是否可以使用 share-preference
, 特征。因此,您应该在后退按钮或 onCreate()
中的某个事件上处理它
我需要在用户关闭我的应用程序时保存一些至关重要的数据。我更喜欢在 Activity
的 onPause()
中执行此操作,因为它是保证在应用程序被销毁之前调用的最新方法,无论其销毁的原因是什么。但是,我将数据保存在数据库中,所以我使用 AsyncTask
。从我的 AsyncTask
开始,当它完成时,我在我之前保存在 AsyncTask
中的 Activity
引用上调用回调方法,我将一些变量放入 SharedPreferences
以表明数据已成功放入数据库。
我的问题是: 是否保证 AsyncTask
完成并在 Activity
引用被销毁之前调用回调?如果不是,如何确保在 Activity
销毁之前将数据写入数据库?
您不需要实施 CallBack
方法来保存您已更新 Database
的 SharedPreferences
。
如果您真的需要一个数据库来存储您的信息,您可以简单地在 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
保持原样,因为之前的交易没有成功完成。
My question is: is the AsyncTask guaranteed to finish and the callback to be called on an alive Activity reference before it gets destroyed? If not, how to ensure that data is written to database before Activity is destroyed?
我的答案是: AsyncTask
的一部分在一个单独的线程中运行,该线程是 DoInBackground,您不能确保 Activity 仍然存在直到完成。如果您尝试在完成后台线程工作后在 UITread 上运行的 postExcute()
中执行任何其他任务。您的应用程序可能会崩溃。这就是为什么我不推荐这样做。
ASyncTask
在后台与主线程并行执行。如果 Activity 关闭,ASyncTask
仍然会继续执行直到结束。而且不需要return控制主进程。
所以,您完全可以使用这种在关闭应用程序之前保存数据的方法。
我不确定在 Activity 的 onPause
之后(即调用 onPause()
回调时)您是否可以使用 share-preference
, 特征。因此,您应该在后退按钮或 onCreate()