我希望在向用户显示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这么难处理配置更改。
我该怎么做才好呢?
提前谢谢。
发布于 2016-10-04 09:33:54
发布于 2016-10-04 08:35:06
你试过RxJava了吗?对于反应性函数式编程来说,这是一个相当棘手的库,但我已经使用它一段时间了,这是值得的。
发布于 2016-10-04 08:47:16
AsyncTask是一个非常古老的技术,您应该使用rxJava库来组织并发工作。使用它,您可以在一个线程上启动作业,在另一个线程上执行作业,并在其他线程上处理结果。它还有两个默认线程池,您可以在单个线程上完成所有操作。活动和片段只是一个UI,顺便说一句,它取决于屏幕方向和设备状态(app可见或最小化)。IntentService允许执行后台任务,并且它有自己的后台线程,但是,一旦作业完成,它就会停止。因此,如果我做对了,您需要通过从IntentService发送广播来通知您的活动yask状态。有一个更好的解决方案--您可以先启动普通服务,然后将活动绑定到它。在绑定过程中,您将获得您的服务接口,并将能够直接寻址到服务。内部服务使用rxJava库组织后台任务。请参阅本教程的第4章,以熟悉并发特性:https://github.com/Froussios/Intro-To-RxJava
https://stackoverflow.com/questions/39847584
复制相似问题