首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在后台工作期间,处理配置更改的正确、最最新的方法是什么?

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

Stack Overflow用户
提问于 2016-10-04 08:29:00
回答 3查看 75关注 0票数 2

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

我试过几种方法,但它们都有缺点,我无法正确地解决。

我试过的是:

  • AsyncTask 内存泄漏问题可以通过使用WeakReference (保存对Activity的引用)来解决,但是,如果在任务运行时重新创建了 Activity实例,则无法调用它(例如,在发生方向更改时)。
  • AsyncTask封装在无头Fragment中: 在onCreate()之外执行onCreate()事务通常会给我Can not perform this action after onSaveInstanceState IllegalStateException。 使用commitAllowingStateLoss()并不是一个合适的解决方案。 在Fragment中添加onCreate()意味着它被附加到Activity上,即使我根本不需要它,这感觉是一个巨大的过度。 例如,如果我有几个AsyncTask,那么实现起来就很麻烦。我要么创建一个包含几个AsyncTask内部类的巨大的Fragments (这感觉不太正确),要么为每个任务创建单独的Fragments,这有点难以管理,导致代码混淆。
  • IntentService + LocalBroadcastManager 这种方法的问题是,即使我尽早注册我的接收器(在onDestroy()中注册,并在onDestroy()中注销),广播仍然有可能发生在方位更改期间,即之后的和 onCreate(),之前,因此我错过了广播。 (不推荐使用粘性广播,谷歌不应使用)

我真的不明白为什么Google这么难处理配置更改。

我该怎么做才好呢?

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-04 09:33:54

RxJava仅仅是做背景工作就有点过分了,而且没有真正解决最初文章中提到的问题。对于任何需要在后台运行并被保留的东西,我最喜欢的方法是加载器。这是为生命周期设计的,很容易重新绑定新的活动,结果将立即或一旦您重新绑定(从未停止或在娱乐期间)交付。

这不会解决碎片状态丢失问题,如果您需要更改片段以响应异步工作,则没有通用的方法来解决这个问题。要么使用CommitAllowingStateLoss并确保在下一次简历中修复状态,要么更改设计,以便将进度内联显示(参见Dianne Hackborn 这里的评论)

票数 4
EN

Stack Overflow用户

发布于 2016-10-04 08:35:06

你试过RxJava了吗?对于反应性函数式编程来说,这是一个相当棘手的库,但我已经使用它一段时间了,这是值得的。

看看这个:https://www.youtube.com/watch?v=k3D0cWyNno4

票数 0
EN

Stack Overflow用户

发布于 2016-10-04 08:47:16

AsyncTask是一个非常古老的技术,您应该使用rxJava库来组织并发工作。使用它,您可以在一个线程上启动作业,在另一个线程上执行作业,并在其他线程上处理结果。它还有两个默认线程池,您可以在单个线程上完成所有操作。活动和片段只是一个UI,顺便说一句,它取决于屏幕方向和设备状态(app可见或最小化)。IntentService允许执行后台任务,并且它有自己的后台线程,但是,一旦作业完成,它就会停止。因此,如果我做对了,您需要通过从IntentService发送广播来通知您的活动yask状态。有一个更好的解决方案--您可以先启动普通服务,然后将活动绑定到它。在绑定过程中,您将获得您的服务接口,并将能够直接寻址到服务。内部服务使用rxJava库组织后台任务。请参阅本教程的第4章,以熟悉并发特性:https://github.com/Froussios/Intro-To-RxJava

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39847584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档