【问题标题】:Holding References to Fragments after the Parent Activity is Destroyed在父 Activity 被销毁后持有对 Fragments 的引用
【发布时间】:2014-10-15 15:22:42
【问题描述】:

应用程序流图(不能直接发布 - 还没有足够的声誉)

简介

我们正在创建一个管理我们产品的应用程序。我们有几种类型的产品 (1),每种类型的产品都有数十种类型 (2)(例如视频)。

我们的网站上有一个 xml 文件,其中包含每个产品的所有信息。当用户选择产品类型 (1) 时,它会访问我们的网站以下载填充产品列表 (2) 的 xml 文件。然后用户从列表中选择产品,然后将信息传递给产品单个活动 (3)。

哦,哲学是在创建应用程序时创建一个用户可以下载与其连接的产品和材料的地方,但让应用程序管理您下载的产品。您可以下载所需的所有内容,因此当您没有互联网连接时,您仍然可以使用该应用程序并查看您下载的产品。

问题

我们应用中的某些产品相当大,需要较长时间才能下载。当用户在产品单一活动 (3) 上时,他们可以下载产品,当配置发生更改时,我们知道我们需要使用片段来维护按钮上的进度条和文本。

!当用户点击返回按钮时,问题就出现了。

我们不想只是取消用户的下载。

  1. 下载完成需要很长时间
  2. 我们希望用户能够一次下载多个产品。

不取消 ASyncTask 实际上让它在用户点击后退按钮时继续运行,甚至允许我们发送 Toast 消息以表明它仍在运行。当用户导航回活动时出现问题,UI 未显示文件仍在下载,因为我们丢失了对正在运行的 ASyncTask 的引用。

解决方案

我们正在尝试提出一种解决方案,以便用户可以退出产品单一活动 (3),稍后再返回并查​​看 ASyncTask 的状态(如果它之前启动)。问题是如果 Activity 被销毁,我们如何保持对 ASyncTask 或 Fragment 的引用。

【问题讨论】:

  • 如果您甚至不让我链接到图像,这个问题就不是很有用...请查看编辑历史以查看图像。

标签: android android-activity android-fragments android-asynctask


【解决方案1】:

您的问题的解决方案是使用服务。 Android 中的服务被设计为长时间运行的后台任务。虽然您不能直接从服务挂钩到 UI 线程,但您可以使用 Handlers 发布到 UI。只要需要,您的服务就会一直存在(Android 只会在内存不足的情况下杀死它们,甚至会尝试远离正在运行的服务)。

AsyncTask 旨在仅用于短操作。可以通过一些更改来使用它来运行更长的进程,但 Android 不喜欢那样做。 Android 专门尝试引导您使用后台线程和进程。

您看到的问题是因为 AsyncTask(通常在 Activity 类中定义)与 Activity 本身相关联并维护对它的引用。但是当一个 Activity 进入后台并在后台停留了一段时间时,该 Activity 可能会被销毁并被 GC 处理,此时 AsyncTask 将失去对父级的引用。使用服务,您的活动是否仍然可用并不重要。您可以随时连接到服务,然后查询服务以查找下载状态。

【讨论】:

  • 非常感谢您的洞察力。感谢您抽出宝贵时间回答我的问题。
【解决方案2】:

首先,即使您的应用程序显示在屏幕上或死机,也有一些服务可以在后台工作。其次,有线程可以工作,工作和工作。 第三,有一个名为 onBind 的方法,它将活动绑定到服务。

你的解决方案??

use threads in services and whenver your activity is called or app is opened
bind it to the service to get what you want...

注意:如果您的文件需要一些时间来下载,那么 asynctask 不是推荐的方法..如果它需要很长时间.. 希望对我有帮助...谢谢

【讨论】:

  • 感谢您的帮助。看来我需要查找服务。之前有人告诉我不要使用 ASyncTasks,现在我很清楚服务是一种更好的方式。
猜你喜欢
  • 1970-01-01
  • 2017-01-05
  • 2016-06-14
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多