屏幕方向期间片段内的异步任务
Posted
技术标签:
【中文标题】屏幕方向期间片段内的异步任务【英文标题】:Async task within fragments during screen oreintation 【发布时间】:2014-04-14 17:48:13 【问题描述】:如何在屏幕定位期间保留异步任务。 我已经搜索了很多,但没有找到任何优雅的解决方案。
我有什么问题 ::
我有不同的纵向和横向布局,所以不能使用android:configChanges="keyboardHidden|orientation|screenSize"
来限制
活动休闲。
我不能使用Fragment.setRetainInstance(boolean)
,因为我有嵌套片段,所以我将片段添加到后堆栈
使用addToBackStack()
在这种情况下:
onCreate()
和 onDestroy()
不会被调用。这在 API 文档中有所提及。
onCreateView()
未收到从 onSaveInstanceState()
传递的包。传入的 Bundle 为空。
所以我不会得到activity
的保存实例
如何在片段中保留异步任务以避免在方向更改时崩溃。
或者有没有其他方法可以执行异步任务。
【问题讨论】:
对不起,如果我不明白,保留任务意味着异步任务在定向后不会再次启动?或者你想在定向后将数据传递给异步任务? @Neha 我不想在屏幕方向上再次启动异步任务。如果旧的活动被破坏,我们应该继续工作而不是给任何内存泄漏。 因此,根据您的 #1 点,每次在方向上您都会破坏当前活动并开始新的活动(基于纵向/横向模式)。并且它的 bcaz 你的异步任务丢失了启动的 bcaz 活动被破坏。所以内存泄漏是问题或者你不知道异步任务需要从哪里开始,就像数据丢失一样。? 这个问题可能有用***.com/questions/8417885/… @Neha 异步任务丢失,因为活动将被破坏。 【参考方案1】:如果您不能使用片段的保留实例,您应该使用Service or an IntentService 来运行您的任务。服务的想法是它保持独立处理活动中发生的事情。因为您没有提及 Tasks 的工作,所以决定哪一个最适合您的应用程序。
在 Activity 中运行 AsyncTask 通常是个坏主意,因为 Activity 可能会被系统销毁或在方向更改时销毁。现在有很多解决方法可以解决这个问题,比如保留片段方法。但是这些有一些缺点,比如你提到的onSaveInstanceState()
点。所有变通方法都处理相同的事情:保留参考。
我不知道为什么使用 Service 不是很流行,这是运行异步任务(任何类型)的最简单方法,而且在考虑如何保存对它的引用时不会头疼。
【讨论】:
感谢回复。我们可以在使用服务时显示任何类型的进度通知吗?我不知道它。使用Loader
而不是AsyncTask
怎么样。关于使用它的任何评论。
你可以使用Notifications,这是设计指南推荐的方式。
但我无法使用通知冻结片段。因为我的片段数据将依赖于来自网络服务的数据。如果我为它使用服务,我将如何管理它。
试试this tutorial 看看如何将数据从服务提供给活动。
哦,是的,使用接收器我们可以更新数据。但我想当服务正在进行后台任务时,我们无法显示任何进度对话框。【参考方案2】:
或者,您可以尝试在自己的任务中启动您的AsyncTask
(请参阅Intent.FLAG_ACTIVITY_NEW_TASK
),这样它的生命周期就变得独立于您的Activity
被销毁然后重新创建。
然后您可以使用Handler
进行通信以检索结果和/或进度。
【讨论】:
以上是关于屏幕方向期间片段内的异步任务的主要内容,如果未能解决你的问题,请参考以下文章