gpt4 book ai didi

java - 如何在 Android 中执行使用 fragment 正确更新 UI 的后台操作?

转载 作者:太空狗 更新时间:2023-10-29 14:13:09 26 4
gpt4 key购买 nike

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

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

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

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

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

例如,当用户启动后台操作(出现进度对话框)、使用主页按钮最小化应用程序并在 Activity 处于后台时操作完成时,就会发生这种情况。然后,应用程序尝试关闭该对话框,但由于 Activity 状态已保存而失败。

我明白这个问题。可以通过确保推迟对 UI 的更改直到 Activity 恢复来解决此问题,如本文所述:How to handle Handler messages when activity/fragment is paused .

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

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

最佳答案

避免您所描述的情况的唯一可靠方法是将结果保存到某种存储中。您可以启动一项服务来执行长时间运行的任务,并将结果写入数据库,并在完成时发送本地广播。

如果 Activity 恰好在前台,它将接收广播并更新其状态以了解进程已完成,并且可以删除有关任务的信息来自您使用的任何持久性存储机制。

如果 Activity 在后台,服务将完成、发送广播并保存结果。下一次 Activity 进入前台时,它应该检查这个持久存储,看看是否有 Unresolved 任务状态,并更新其状态以匹配。

因此,一个示例纲要可能是(让我们使用“上传照片”作为任务):

  1. 用户点击按钮开始上传图片

  2. Activity 启动服务将图片上传到远程服务

  3. Activity 为您定义的某些广播事件注册一个 LocalBroadcastManager(例如 com.mypackage.ACTION_PHOTO_UPlOADED)

  4. 服务保留有关任务的一些信息(例如 SharedPreferences.putBoolean("TASK_PHOTO_UPLOADED", false)

  5. Activity 在服务处理上传任务时显示某种加载 UI

  6. 用户按下主页并将应用程序发送到停止状态

  7. Activity 注销本地广播管理器

  8. 服务完成上传图片

  9. 服务发送本地广播 (com.mypackage.ACTION_PHOTO_UPlOADED),该广播未被使用,因为 Activity 不再监听

  10. 服务更新持久化信息 (SharedPreferences.putBoolean("TASK_PHOTO_UPLOADED", true))

  11. Android 终止 Activity,保存其状态

  12. 用户稍后返回到 Activity

  13. Activity 在 onResume() 中检查服务以查看是否有未处理的任务结果(if (SharedPreferences.has("TASK_PHOTO_UPLOADED"))),然后检查看看它是否应该更新状态。

  14. 如果照片上传 key 存在并且为真,Activity 将删除对话框 fragment 并从 SharedPreferences 中清除 TASK_PHOTO_UPLOADED key 。

    如果照片上传 key 存在,且为false,Activity注册一个本地广播管理器等待事件完成

关于java - 如何在 Android 中执行使用 fragment 正确更新 UI 的后台操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25087216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com