【问题标题】:Using AsyncTask to preload data for a new Activity使用 AsyncTask 为新的 Activity 预加载数据
【发布时间】:2013-08-20 21:52:43
【问题描述】:

我有我的MainActivity,它可以让用户选择要打开的页面,所有这些都涉及从互联网下载一些数据并显示它。为了避免用户在选择页面时等待,我将AsyncTask 作为MainActivity 的子类,当下载完成时会生成一个对象DATA

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

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

AsyncTask 不必是MainActivity 的子类,到目前为止,这样做很整洁,

感谢您的帮助!

【问题讨论】:

    标签: android android-activity android-asynctask preload


    【解决方案1】:

    这是一种方法:

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

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

    【讨论】:

    • 这基本上解决了我所有的问题 :D 谢谢!我不确定这是否是这样做的直接后果,但如果我让我的模拟器打开应用程序运行一段时间然后回来它会给我一个“无法初始化 MyApplication”错误。我假设它与活动生命周期有关,但我不完全确定
    【解决方案2】:

    只有Parcellable(通过Intent)才能在活动之间直接传递信息。 Parcellable 几乎可以制作任何东西,但这并不总是一个好主意,尤其是当数据量很大时。

    下一个问题是,当您的 AsyncTask 运行时间长于活动持续时间时,您的第一个活动的 Context 很可能保持活动状态。当您旋转设备时,经常会重新创建 Activity 实例,并且幼稚的实现往往会在新实例中启动另一个异步任务,并最终得到多个下载相同数据的任务。您需要在同一 Activity 的实例之间传递正在运行的任务的引用。

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

    【讨论】:

      【解决方案3】:

      我最近在处理 AsyncTask 时遇到了困难,并且在任务在后台运行时难以让 UI 正常运行。虽然周围有一些服务并不适合您所描述的那种东西,但我发现它们更容易使用。您可以检查intentService 作为中间立场。好的 tut 可以找到 herespecifically concerning intentService, here.

      【讨论】:

        猜你喜欢
        • 2012-03-21
        • 1970-01-01
        • 2020-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多