1

我正在 Android 上开发多人在线文字游戏,并希望实现一个线程来检查服务器端事件,如下所示:

  • 玩家加入游戏。
  • 玩家离开了一场比赛。
  • 玩家赢了一场比赛。
  • ETC...

如果对用户可见,线程将负责侦听各种事件并将事件分派给负责的活动。

换句话说,为了更清楚,我有一个事件列表,每个活动都必须注册到这些事件的子集。

事件:

E1 - E2 - E3 - E4

活动:

  • 活动 1 对 E1 和 E2 感兴趣。
  • 活动 2 对 E1、E2 和 E3 感兴趣。
  • 活动 3 对 E3 和 E4 感兴趣。

我在问实现在后台运行的线程并可以将事件分派给所有活动的最佳设计方法?

一些想法:

- 在应用程序级别实现 AsyncTask。

- 将广播意图发送到自定义操作。

- 服务不是最好的方法,因为它应该被创建为在用户不与您的应用程序交互时在后台运行。

你能提出一个最佳实践方法吗?

4

1 回答 1

1

一个很好的方法是使用结合 AsyncTasks 的服务。

虽然服务在用户不与您的应用程序交互时很有用,但这肯定不是它唯一的用途。服务是任何不需要 UI 的东西的逻辑家园。

在数据驱动的应用程序中,我使用服务作为 API 适配器层。这很好,因为我可以从任何活动中启动它,而不必担心它是否已经实例化,或者我完成后是否需要做任何清理工作。该框架管理服务的生命周期并跟踪客户端。

我认为你的情况类似。只要需要,每个活动都可以使用bindService和注册更新。unbindService只要绑定了任何 Activity,服务就会继续做它的事情。onBind服务可以使用在和中接收到的 Intent 来跟踪哪些活动需要更新onUnbind,并通过特定的 Intent 向它们发送更新,或者更恰当地说,服务可以触发广播意图,并且活动可以注册他们需要的内容。

在服务中,您将运行 AsyncTasks(可能会在其上运行它们AsyncTask.THREAD_POOL_EXECUTOR以便获得多个线程)来进行更新。请记住,服务本身是在 UI 线程上启动的。

使用服务的另一个好处是它不需要 Activity 来运行。想到的一个用途是关机后清理。如果您需要在用户退出时发布分数或分析或其他内容,您可以让活动快速关闭并在后台完成更长时间运行的工作。

活动可以使用 向服务请求那些较长的单个任务,并且服务在调用(或)startService之前不会退出。stopSelfstopSelfResult

start/stop 和 bind/unbind 的组合确实允许对服务进行干净的管理。它会在需要时且仅在需要时运行,并且您可以将所有 API 访问权限保存在一个地方。

编辑:

好像这不是一个足够坚固的文字墙,我想出了另一个使用服务的好理由。来自进程和线程的开发人员指南

由于运行服务的进程的排名高于具有后台活动的进程,因此启动长时间运行操作的活动可能会更好地为该操作启动服务,而不是简单地创建工作线程 - 特别是如果操作可能超过活动...

于 2012-12-05T08:13:07.557 回答