android - 在 Activity 被销毁之前安全地保存数据

标签 android android-asynctask activity-lifecycle

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

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

最佳答案

您无需实现 CallBack 方法即可将已更新的数据库 保存在 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() 中执行任何其他任务。您的应用程序可能会崩溃。这就是为什么我不建议这样做。

关于android - 在 Activity 被销毁之前安全地保存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30296103/

相关文章:

android - 在操作系统重启后调用 onActivityResult() 之前是否重新创建了 Activity 的 View ?

android - 无法推送到 Github;错误 403

android - Bluetooth LE TX 功率读数

java - 拍照时如何获取默认相机存储位置?

android - 如果客户端的进程被android杀死了,我们会不会泄露android服务连接?

Android Activity 生命周期在启动新 Activity 时调用两次

android - 占无限量的 SQLite 列?

Android,单例异步任务

java - 在 SearchView.onQueryTextSubmit() 和 AsyncTask 上更新 ListView

android - 如何正确使用 AsyncTask