使用AsyncTask为新Activity预加载数据

时间:2013-08-20 21:52:44

标签: android android-activity android-asynctask preload

我有MainActivity,它为用户提供了一系列要打开的页面,所有这些页面都涉及从互联网上下载一些数据并进行显示。为了保存用户在选择页面时等待,我将AsyncTask作为MainActivity的子类,在下载完成时生成对象DATA

在以下情况下,如何将DATA传递给SecondActivity

  • 用户在SecondActivity下载完成之前选择AsyncTask
  • 在用户选择SecondActivity
  • 之前完成下载

AsyncTask并不一定是MainActivity的子类,到目前为止,它一直都很整洁,

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

这是实现此目的的一种方法:

Application中创建对数据的引用。 Android应用程序是存储全局数据的好地方。接下来,通过AsyncTask填充数据(注意使用AsyncTask的缺陷)。您现在可以通过类似于以下的调用访问您的数据:((MyApplication)getApplication).mydata

正如您所提到的,可能会出现两种情况。数据是否已填充或未填充。要处理此问题,请使用观察者观察数据的变化。当数据为空时,将SecondActivity注册为观察者。当数据可用时,您的SecondActivity更新方法将被调用,您可以随意使用它。最后,确保取消注册成为观察者。 希望这会有所帮助。

答案 1 :(得分:1)

直接在活动之间传递信息只有在Parcellable(通过Intent)时才有效。几乎任何事情都可以Parcellable,但它并不总是一个好主意,特别是当数据量很大时。

下一个问题是,当运行时间超过活动持续时间时,您的AsyncTask最有可能使第一个活动的Context保持活动状态。当您旋转设备时,通常会重新创建活动实例,而初始实现往往会在新实例中启动另一个asynctask,最终会导致下载相同数据的多个任务。您需要在同一个Activity的实例之间传递正在运行的任务的引用。

最简单的解决方案可能是创建一个单例(或Service),可以从承载AsyncTask&的两个活动中访问。加载数据。如果它需要Context使用getApplicationContext(),因为在Activites的生命周期之外使用它是安全的。 活动可以在活动时将自己注册为“数据加载”事件的监听器。

答案 2 :(得分:0)

我最近在使用AsyncTask时遇到困难,并且在任务在后台运行时难以让UI表现出来。虽然有关于服务的评论并不适合您所描述的那种事情,但我发现它们更易于使用。您可以将intentService视为中间立场。可以找到好的tut herespecifically concerning intentService, here.