Android 在异步操作之后,如何正确获取上下文以将数据从片段保存到共享首选项中?

Android 在异步操作之后,如何正确获取上下文以将数据从片段保存到共享首选项中?,android,android-fragments,android-activity,android-asynctask,Android,Android Fragments,Android Activity,Android Asynctask,我有这样的配置 活动使用一个片段显示一些云应用程序设置 片段执行http请求以应用更改的设置 如果请求成功,应用程序应该将更改保存到共享首选项中,这需要一个上下文对象 问题是,当用户单击Save按钮时,会执行http请求。如果用户决定离开设置屏幕,那么片段的getActivity()方法将返回null,并且我无法将设置保存到共享首选项中。如何最恰当、最普遍地解决此问题?可能在活动被销毁时-取消请求: @Override public void onDetach() { s

我有这样的配置

  • 活动使用一个片段显示一些云应用程序设置
  • 片段执行http请求以应用更改的设置
  • 如果请求成功,应用程序应该将更改保存到共享首选项中,这需要一个上下文对象

  • 问题是,当用户单击Save按钮时,会执行http请求。如果用户决定离开设置屏幕,那么片段的getActivity()方法将返回null,并且我无法将设置保存到共享首选项中。如何最恰当、最普遍地解决此问题?

    可能在活动被销毁时-取消请求:

    @Override
        public void onDetach() {
            super.onDetach();
            asyncTask.cancel(true);
        }
    

    或者,如果您希望在请求运行时保存数据-阻止返回按钮。

    我假设您是通过
    AsyncTask
    进行服务调用的(您应该使用
    AsyncTask
    ,而不是在UI线程中执行调用)。在这种情况下,您可以将
    SharedReferences
    中的更改保存在
    AsyncTask
    本身中。有关更多信息,请参阅:

    您可以使用应用程序上下文而不是活动。但据我所知,如果您的片段已关闭,则可能无法访问整个请求。最好的方法应该是让某种服务(intentService)在后台执行请求。这不是一个好的解决方案,因为它可能导致内存泄漏,因为这样的异步任务可以保留对已完成活动的引用