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

saving data safely before Activity is destroyed

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

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

您不需要实施 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 保持原样,因为之前的交易没有成功完成。

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()

中的某个事件上处理它