我希望在向用户显示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为何难以处理配置更改。
我该如何正确地做到这一点?
提前致谢。
答案 0 :(得分:4)
RxJava对于后台工作来说有点矫枉过正,并没有真正解决原帖中提到的问题。 我最喜欢的方法是需要在后台运行并保留的Loader。这被设计为具有生命周期意识,很容易重新绑定新活动,结果将立即或重新绑定后发送(永远不会在停止或重新创建时)。
这不会修复片段状态丢失问题,如果您需要更改片段以响应异步工作,则没有通用的方法来解决此问题。使用CommitAllowingStateLoss并确保在下一个简历中修复状态,或者更改设计以使进度以内联方式显示(请参阅Dianne Hackborn的评论here)
答案 1 :(得分:0)
你试过RxJava吗?它是反应性函数式编程非常棘手的库,但我已经使用了一段时间并且它有所回报。
答案 2 :(得分:0)
AsyncTask是一项非常古老的技术,您应该使用rxJava库来组织并发工作。有了它,你可以在一个线程上开始工作,在另一个线程上工作并在其他一些线程上处理结果。它还有两个默认线程池,您可以在一个线程上执行所有操作。 活动和片段只是一个UI,顺便说一下,它取决于屏幕方向和设备状态(app可见或最小化)。 IntentService允许执行后台任务,它有自己的后台线程,但是一旦作业完成就会停止。 所以,如果我做对了,你需要通过从IntentService发送广播来通知你的活动yask状态。 有一个更好的解决方案 - 您可以先启动普通服务,然后将Activity绑定到它。在绑定过程中,您将获得服务的界面,并且可以直接向服务寻址。 Inside Service使用rxJava库组织后台任务。 请参阅本教程的第4章以熟悉并发功能:https://github.com/Froussios/Intro-To-RxJava