屏幕方向期间片段内的异步任务

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 进行通信以检索结果和/或进度。

【讨论】:

以上是关于屏幕方向期间片段内的异步任务的主要内容,如果未能解决你的问题,请参考以下文章

异步任务片段背景数据

从片段中调用分离的异步任务类

csharp 线程和异步任务片段

Android 我应该在异步任务中将片段作为弱引用传递吗?

在 TabLayout 和 ViewPager2 中执行异步任务后更新具有相同布局的多个片段

当片段视图加载是异步任务的一部分时,如何在片段加载之前显示进度条?