Java 如何在Android中执行后台操作,使用片段正确更新UI?

Java 如何在Android中执行后台操作,使用片段正确更新UI?,java,android,android-asynctask,android-fragmentactivity,Java,Android,Android Asynctask,Android Fragmentactivity,我找不到任何满足我所有要求的解决方案 在我的应用程序中,我使用AsyncTasks执行一些操作,如将数据保存到内存或从数据库读取数据。我在onPreExecute中创建一个进度对话框,在onProgressUpdate中更新进度值,并在onPostExecute中关闭该对话框 最近我切换到Fragment API(我使用支持库来针对旧版本的Android),这意味着我的activities子类FragmentActivity和dialogs子类DialogFragment 切换到片段API导致了

我找不到任何满足我所有要求的解决方案

在我的应用程序中,我使用
AsyncTasks
执行一些操作,如将数据保存到内存或从数据库读取数据。我在
onPreExecute
中创建一个进度对话框,在
onProgressUpdate
中更新进度值,并在
onPostExecute
中关闭该对话框

最近我切换到Fragment API(我使用支持库来针对旧版本的Android),这意味着我的activities子类
FragmentActivity
和dialogs子类
DialogFragment

切换到片段API导致了一个众所周知的问题-有时我会遇到以下异常:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
例如,当用户启动后台操作(出现一个进度对话框)时,使用“主页”按钮最小化应用程序,当活动位于后台时,操作完成。然后,应用程序尝试关闭对话框,但由于活动的状态已保存,因此此操作失败

我理解这个问题。可以通过确保推迟对UI的更改来修复此问题,直到活动恢复,如本文所述:

然而,这个解决方案导致了另一个问题。如果操作在活动处于后台时完成,然后该活动被Android杀死,该怎么办?当用户导航回应用程序时,它将恢复保存在
onSaveInstanceState
中的状态。因此,进度对话框仍然可见,其进度值与将活动放入后台时的进度值相同。一条应该取消它的消息从未被处理,并且在活动被终止时丢失

正确处理所有描述的问题的正确解决方案是什么?如何允许在活动处于后台时更改UI,或者至少允许推迟UI更改,并确保在活动被Android杀死时不会丢失UI?解决方案必须允许跟踪后台任务的进度。

  • 你的问题很长,没有任何代码示例,我会尽力给出我最好的答案,我已经为你做了一个关于你如何 应在android中使用
    onSaveinstance
    状态,这将解决所有问题 可能的问题

  • 我在下面写了一篇解释文章,这将消除你的所有疑虑


在android生命周期中,如何应对

  • 活动
    具有用于
    片段的
    容器

  • 活动

  • 当我们使用片段添加替换等时,我们需要使用android
    fragment
    reference而不是
    classreference

  • 每次我们将片段装入容器时,将片段保留在
    backstack

  • 在该项目中,我们可以观察到,我们正在收集
    onpause()
    上的小部件的所有状态,并存储在一个局部变量中,使用该局部变量,然后将该局部变量传递到
    onSaveInstance()
    事件访问
    onactivitycreated()
    中的这些标记设置为视图对象。我们使用这个过程是因为localvariables保存在类中,而view对象在
    onSaveInstance
    中是
    null
    。在
    活动
    -
    片段一
    -
    片段二
    -
    片段一
    -
    方向改变
    -
    方向改变

  • 安卓
    静态对象
    能够保留状态
    onOrientation更改
    ,但
    动态对象
    必须重置
    onOrientation
    使用上述本地变量更改值

  • 如果我们使用的是动态片段,则在使用
    saveInstanceState
    还原动态对象之前,必须在
    OnActivityCreated()
    事件中创建动态对象

  • 片段被添加到
    onPause
    事件的backbackback中

  • 如果屏幕导航为
    Activity
    -
    FragmentOne
    -
    FragmentTwo
    -
    FragmentOne
    -
    FragmentTwo
    ,则按下后退按钮,导航将作为
    FragmentTwo
    -
    FragmentTwo
    -
    FragmentOne
    -
    活动运行,因此,我们可以清楚地观察到,android Backback正在跟踪我们的路径

  • 如果路径为
    Activity
    -
    FragmentOne
    ,并且第一次更改方向,则触发的事件如下
    main活动onCreate
    -
    FragmentOne-onAttach
    -
    FragmentOne onCreate
    -
    FragmentOne onCreateView
    -
    activitycreated上的FragmentOne
    -
    FragmentOne启动
    -
    FragmentOne-onResume

  • 如果路径为
    Activity
    -
    FragmentOne
    -
    orientationchange
    并首次更改方向,则触发的事件如下

main活动onCreate
-
FragmentOne-onAttach
-
FragmentOne onCreate
-
FragmentOne onCreateView
-
activitycreated上的FragmentOne
-
FragmentOne启动
-
FragmentOne-onResume
-
FragmentOne onPause
-
FragmentOne onSaveInstanceState
-
FragmentOne在顶部
-
FragmentOne onDestroy
-
FragmentOne onDetach
-
main活动onCreate
-
FragmentOne-onAttach
-
FragmentOne onCreate
-
FragmentOne onCreateView
-
activitycreated上的FragmentOne
-
F