什么是应用程序级线程的正确设计方法?

时间:2012-12-05 07:32:24

标签: java android

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

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

线程将负责监听各种事件并将事件分派给负责的活动。如果用户可以看到它。

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

活动:

E1 - E2 - E3 - E4

活动:

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

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

一些想法:

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

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

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

您能提出最佳做法吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

我认为你的情况类似。只要需要,每个活动都可以使用bindServiceunbindService注册更新。只要绑定任何Activity,服务将继续执行其操作。该服务可以使用onBindonUnbind中收到的意图跟踪哪些活动需要更新,并通过特定意图发送更新,或者更合适的是,服务可以触发广播意图和活动可以注册他们需要的东西。

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

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

活动可以使用startService从服务请求更长的单个任务,并且在调用stopSelf(或stopSelfResult)之前服务不会退出。

start / stop和bind / unbind的组合确实可以实现对服务的干净管理。它将在需要的时候运行,并且您可以将所有API访问保存在一个位置。

修改

好像这不是一个坚固的文本墙,我想出了另一个使用服务的充分理由。来自the developer guide on processes & threads

  

因为运行服务的进程排名高于进程   与后台活动,一个启动长期运行的活动   相反,操作可能会为该操作启动服务   而不是简单地创建一个工作线程 - 特别是如果操作将   可能比活动更持久......