异步任务完成后更新片段

时间:2014-01-20 21:05:20

标签: android android-fragments android-asynctask

我有一个viewpager片段设置,我在活动开始时运行AsyncTask来从JSON get中加载一些数据(它提取的数据只需要执行一次,所有片段都将使用它)。我遇到的问题是我想从AsyncTask中获取这些数据,并将其作为所有文本视图从片段中提取的数据。

从AsyncTask加载数据然后让片段引用该数据的最佳方法是什么。你不能让视图引用来自get-go的数据,因为它是Nullpointers,我真的想避免在AsyncTask的OnPostExecute中引用每个单独的textview,如果我在Parent Activity中有它。

2 个答案:

答案 0 :(得分:3)

只需从视图中分离数据存储即可。通过这种方式,处理数据下载并在获取完成后将其显示在各种片段中将更容易。

基本思想是:在与活动(服务或意图服务)分离的后台线程中启动下载,然后将数据更新为存储(sqllite,如果它是复杂的,共享首选项,甚至单个对象,即使我不喜欢后一种方法。)

执行get后,通知片段数据可用。不过,你在这里有很多选择。如果您决定在服务中托管线程/ asynctask,您可以绑定回调,然后通知所有感兴趣的片段,您可以使用可以使用本地广播接收器拦截的(本地)广播消息,或者您甚至可以使用消息总线,如otto。

最后,我真的建议使用intent服务来执行异步作业。这是执行任何 one-shot 操作的最简单方法,无需处理服务创建和/或活动配置更改。

答案 1 :(得分:0)

不确定这是否是“最佳”方式,但我首先想到的是着名的观察者模式。

  • 使用一个名为Observer的接口创建一个名为Fragment的接口 通知()
  • 在希望在数据准备就绪时收到通知的所有List中实施此界面
  • Observer
  • 中保留AsyncTaskonPostExecute()个对象
  • List中,遍历此Observer并在每个Fragment上调用notify(),并传递相应的数据
  • 对给定数据的{{1}}内的通知做出反应

这是对此解决方案的一个非常粗略的描述,但我希望你明白这一点。