2009-07-22 74 views
6

以下是协议:我有一个Android应用程序需要每X秒(当前为60秒)调用Web服务。此应用程序有多个选项卡,这些选项卡都需要与数据本身进行交互。一个是MapView,一个是ListView,然后第三个不相关,但最终还需要获取一些全局数据。问题是我希望我的主要活动有一个在后台运行的线程,获取结果,然后指示TabHost中的两个子活动使用最新数据更新自己。另外,当用户点击选项卡并且onCreate/onResume活动触发时,我还想通过从主活动获取最新数据来强制重绘。我真的很茫然。我已经尝试过使用服务和一些贫民窟静态方法来将活动的实例传递给服务,以便每当定时器启动时调用特定的函数来更新其视图,但减速非常糟糕,代码只是丑陋丑陋难看。有什么建议么?在Android TabHost应用程序中完成活动间通信的最佳方式

编辑:所以我在tabhost活动中将它实现为一个定时器驱动的线程,然后在每个子活动中都有计时器驱动的线程,然后获取数据(以同步的方式)并更新它们的映射/列表。它的速度更快,但还是感觉稍微砍十岁上下,特别是部分在那里我打电话,像这样在父活动的自定义函数:

((MainActivity)getParent()).getNearbyMatches(); 

这增加了我不是完全激动强耦合的元素但是从性能的角度来看,它要好得多。我很欣赏已经给出的答案,并会对内容提供商方面进行一些研究,但我不确定我是否想回到服务模型。

+0

我希望我也知道如何做到这一点!+1 – cakeforcerberus 2009-07-22 15:05:54

回答

7

所以我找到了我相信的答案:The Application Class。您可以扩展此类以跟踪全局应用程序状态。

AndroidManifest.xml文件中,您可以在android:name属性中引用完全限定的自定义类,它将在应用程序启动时实例化。

任何Activity然后可以调用"getApplication()",它将返回您的自定义应用程序类的实例,然后您可以量身定做。

+0

以及如何在接收机级内检查它应该启动的活动是否已在运行? – bofredo 2013-08-29 12:31:20

1

您可以在Handler s中实现GUI更新,并在您的下载线程中注册Handler实例。下载线程随后在新数据到达时将消息发送到处理程序。基本上这是Observer Pattern。 您可以找到如何使用Handler s here的示例(展开'使用第二个线程的示例ProgressDialog'部分)。

5

为什么每次新数据可用时都要更新所有儿童活动?这听起来对我来说效率很低。只更新当前可见的活动。

一个可能的方法是通过custom content provider。让您的服务将数据源更新为您的活动,并获取当前可见的活动以收听有关此内容的更改。所以基本上,当OnResume被调用时,你注册到内容提供者,当OnPause被调用时,注销。

作为一个经验法则,永远不会存储活动的静态引用!你会以丑陋的泄漏结束。如果这是您的应用必须至少使用WeakReferences

相关问题