代码之家  ›  专栏  ›  技术社区  ›  MattC

在Android TabHost应用程序中实现活动间通信的最佳方法

  •  6
  • MattC  · 技术社区  · 15 年前

    交易是这样的:我有一个Android应用程序,需要每隔x秒(目前是60秒)调用一次Web服务。这个应用程序有多个选项卡,这些选项卡都需要与数据本身交互。一个是mapview,一个是listview,第三个是无关的,但最终还需要获取一些全局数据。问题是,我希望我的主活动有一个在后台运行的线程,获取结果,然后指示tabhost中的两个子活动使用最新数据更新自己。此外,当用户单击选项卡并触发OnCreate/OnResume活动时,我还希望通过从主活动获取最新数据来强制重绘。我在这里真是迷路了。我用一个服务和一些ghetto静态方法尝试了这个方法,将活动的一个实例传递给服务,以便在计时器触发时调用特定的函数来更新它们的视图,但是速度非常慢,代码非常难看。有什么建议吗?

    编辑:所以我在tabhost活动中将它实现为一个计时器驱动的线程,然后在每个子活动中都有计时器驱动的线程,这些线程随后(以同步方式)获取数据并更新它们的映射/列表。虽然速度快得多,但还是有点黑客的感觉,特别是在父活动中我调用自定义函数的部分,比如:

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

    这增加了一种强烈耦合的元素,我并不完全为之激动,但从性能的角度来看,它比以前好多了。我很感谢已经给出的答案,并将在内容提供商前面做一些研究,但我不确定我是否要回到服务模型。

    3 回复  |  直到 15 年前
        1
  •  7
  •   Don Chakkappan    10 年前

    The Application Class

    AndroidManifest.xml android:name

    任何活动都可以调用 "getApplication()" 它将返回自定义应用程序类的实例,然后您可以根据自己的喜好进行定制。

        2
  •  5
  •   Prashast    15 年前

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

    一种可能的方法是通过 custom content provider .让您的服务将数据源更新到您的活动中,并获取当前可见的活动以侦听此内容的更改。所以,基本上,当调用onresume时向内容提供者注册,当调用onpause时注销。

    WeakReferences

        3
  •  1
  •   Josef Pfleger    15 年前

    Handler 并注册 具有下载线程的实例。然后,下载线程在新数据到达时向处理程序发送消息。本质上这是 Observer Pattern here (展开“带第二个线程的示例ProgressDialog”部分)。