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
reference而不是fragment
classreference
- 每次我们将片段装入容器时,将片段保留在
中backstack
- 在该项目中,我们可以观察到,我们正在收集
上的小部件的所有状态,并存储在一个局部变量中,使用该局部变量,然后将该局部变量传递到onpause()
事件访问onSaveInstance()
中的这些标记设置为视图对象。我们使用这个过程是因为localvariables保存在类中,而view对象在onactivitycreated()
中是onSaveInstance
。在null
-活动
-片段一
-片段二
-片段一
-方向改变
方向改变
- 安卓
能够保留状态静态对象
,但onOrientation更改
必须重置动态对象
使用上述本地变量更改值onOrientation
- 如果我们使用的是动态片段,则在使用
还原动态对象之前,必须在saveInstanceState
事件中创建动态对象OnActivityCreated()
- 片段被添加到
事件的backbackback中onPause
- 如果屏幕导航为
-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