【问题标题】:Sync between local service with a thread and an activity在本地服务与线程和活动之间同步
【发布时间】:2010-06-01 07:05:15
【问题描述】:
我正在尝试如何在本地服务和主要活动之间进行同步。
本地服务有,
- 具有可以随时接收数据的套接字连接的线程。
- 包含数据的列表/数组。
- 套接字可以随时接收数据并将其添加到列表中。
活动需要显示这些数据。因此,当活动启动时,它需要附加或启动本地服务并获取列表。如果列表有更新,也需要通知它。
我想我需要以某种方式同步我的列表,以便本地服务不会在连接到服务时获取列表时向其添加新条目。
有什么想法吗?
谢谢。
【问题讨论】:
标签:
android
multithreading
service
【解决方案1】:
我回答了一个有点类似的问题here。在这个答案中是一个链接,指向由马克布雷迪在柏林的 droidconf 上举行的演示文稿。在他的slides 中,他描述了一个管理这类事情的框架。他还在github 上提供了这方面的来源。
他提出了以下解决方案。构建一个位于自定义应用程序类范围内的控制器对象。控制器启动服务或简单的工作线程,并在服务通知它发生某些更改时通知 UI。如果不是绝对必要,他建议不要使用 AIDL。
android 文档还提供了关于如何启动本地进程的example。
【解决方案2】:
有很多方法可以在活动和服务之间建立连接并在它们之间共享数据。您可以使用以下解决方案进行通信:
- 意图。您可以发送(sendBroadcast (Intent intent))和接收(BroadcastReceiver)Intents。示例场景:您的活动在启动时发送广播“GIVE_ME_ALL_DATA”,服务发送响应。如果服务有新数据,它也会广播“ HEY_I_HAVE_NEW_DATA”。
- 内容提供者。服务和活动从它并行读取和写入。您可以将观察者附加到特定的数据 URL,因此每个听众都会被告知更改。如果您使用CursorAdapter将数据绑定到ui组件,用户界面将自动更新。
-
AIDL。这是一个android'a IPC。您为向客户端公开的服务定义接口。一开始的客户端:与服务建立连接,请求数据,注册回调。如果服务有新数据,它会调用客户端注册的回调。