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

时间:2016-10-04 08:29:01

标签: android

我希望在向用户显示ProgressDialog的同时执行相对较短(最多2-3秒)的后台任务(我想在开始时显示ProgressDialog任务并在最后解雇它。)

我尝试了几种方法,但所有方法都有缺点,我无法正确解决。

我尝试了什么:

  • AsyncTask

    使用WeakReference(保存对Activity的引用)可以解决内存泄漏问题,但我无法回复 {{1如果在任务运行时重新创建了实例(例如,在方向更改的情况下)。

  • Activity包裹在无头AsyncTask

    Fragment之外提交Fragment次交易通常会为我提供onCreate() Can not perform this action after onSaveInstanceState

    使用IllegalStateException并不是一个合适的解决方案。

    commitAllowingStateLoss()中添加Fragment表示它已附加到onCreate(),即使我根本不需要它,这感觉就像是一个巨大的矫枉过正。

    实施屁股很痛苦,例如,如果我有几个Activity。我必须创建一个包含多个AsyncTask内部类的巨大Fragment,感觉不对,或者为每个任务创建单独的AsyncTask,这有点难以管理和结果令人困惑的代码。

  • Fragments + IntentService

    这种方法的问题是,即使我尽早注册我的接收器(在LocalBroadcastManager中,并在onCreate()中取消注册),仍然有可能在方向更改期间广播,onDestroy()之后和onDestroy()之前,所以我想念广播。

    (粘性广播已弃用,不得根据Google使用)

我真的不明白Google为何难以处理配置更改。

我该如何正确地做到这一点?

提前致谢。

3 个答案:

答案 0 :(得分:4)

RxJava对于后台工作来说有点矫枉过正,并没有真正解决原帖中提到的问题。 我最喜欢的方法是需要在后台运行并保留的Loader。这被设计为具有生命周期意识,很容易重新绑定新活动,结果将立即或重新绑定后发送(永远不会在停止或重新创建时)。

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

答案 1 :(得分:0)

你试过RxJava吗?它是反应性函数式编程非常棘手的库,但我已经使用了一段时间并且它有所回报。

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

答案 2 :(得分:0)

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