2014-01-20 34 views
0

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

从AsyncTask加载数据然后让片段引用该数据的最佳方式是什么?你不能只将视图引用数据,因为它是Nullpointers,我真的想避免在父活动中引用AsyncTask的OnPostExecute中的每个单独的textview。

回答

3

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

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

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

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

+0

意图服务是一个很好的调用,我喜欢它的设置方式,适合我想要做的很好,以及用于通知片段的广播方法。 – Razgriz231

0

不知道这是否是“最好”的方式,但我首先想到的是着名的Observer模式。

  • 创建一个名为Observer的接口有一个方法叫 通知()当数据准备好
  • 内保持ObserverList一个对象
  • 实施希望得到通知所有Fragment s此接口您AsyncTask
  • onPostExecute(),遍历该List和调用notify()上的每个Observer,传递适当的数据
  • 产生反应通知您Fragment的内线提供的数据

这该解决方案的一个非常粗略的描述,但我希望你的想法。