gpt4 book ai didi

android - 在后台工作期间处理配置更改的正确、最新的方法是什么?

转载 作者:搜寻专家 更新时间:2023-11-01 07:48:00 26 4
gpt4 key购买 nike

我想在向用户显示 ProgressDialog 的同时执行相对较短(最多 2-3 秒)的后台任务(我想显示 ProgressDialog 在任务开始并在结束时将其关闭)。

我尝试了几种方法,但它们都有我无法妥善解决的缺点。

我尝试过的:

  • 异步任务

    内存泄漏问题可以通过使用 WeakReference(保存对 Activity 的引用)来解决,但我无法回调到 new Activity 实例,如果它在任务运行时被重新创建(例如,在方向改变的情况下)。

  • AsyncTask 包裹在 headless Fragment 中:

    onCreate() 之外提交 Fragment 事务经常给我 Can not perform this action after onSaveInstanceState IllegalStateException.

    使用 commitAllowingStateLoss() 感觉不是一个合适的解决方案。

    onCreate() 中添加 Fragment 意味着它附加到 Activity 即使我根本不需要它,这感觉像是一个巨大的矫枉过正。

    实现起来很麻烦,例如,如果我有多个 AsyncTask。我必须创建一个巨大的 Fragment,其中包含几个 AsyncTask 内部类,这感觉不对,或者为每个任务创建单独的 Fragment ,这有点难以管理并导致代码困惑。

  • IntentService + LocalBroadcastManager

    我对这种方法的问题是,即使我尽早注册我的接收器(在 onCreate() 中,并在 onDestroy() 中取消注册),它是广播仍然有可能在方向改变期间发生,onDestroy() 之后和 onCreate() 之前,所以我错过了广播。

    (粘性广播已弃用,根据 Google 的说法不应使用)

我真的不明白为什么谷歌让处理配置更改变得如此困难。

我应该如何正确执行此操作?

提前致谢。

最佳答案

RxJava 只是做后台工作有点矫枉过正,并没有真正解决原始帖子中提到的问题。对于需要在后台运行并保留的任何东西,我最喜欢的方法是 Loader .这是为了生命周期感知而设计的,很容易重新绑定(bind)新的 Activity,结果将立即或在您重新绑定(bind)后立即交付(永远不会在停止或重新创建时)。

这不会解决 fragment 状态丢失问题,如果您需要更改 fragment 以响应异步工作,则没有通用的方法来解决此问题。要么使用 CommitAllowingStateLoss 并确保在下一份简历中修复状态,要么更改设计以便在线显示进度(请参阅 Dianne Hackborn 的评论 here )

关于android - 在后台工作期间处理配置更改的正确、最新的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39847584/

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