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



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

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

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

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

事件:

E1-E2-E3-E4

活动:

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

我想问的是,实现一个在后台运行并可以将事件调度到所有活动的线程的最佳设计方法是什么?

一些想法:

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

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

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

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

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

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

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

我认为你的情况类似。只要需要,每个活动都可以使用bindServiceunbindService来注册更新。只要绑定了任何"活动",服务就会继续执行其任务。该服务可以使用在onBindonUnbind中接收到的意图来跟踪哪些活动需要更新,并通过特定的意图向它们发送更新,或者,更合适的是,该服务可以激发广播意图,活动可以注册它们需要的内容。

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

使用服务的另一个好处是它不需要运行"活动"。脑海中浮现的一个用途是关闭后的清理。如果你需要在用户退出时发布分数或分析或其他内容,你可以允许活动快速关闭,并在后台完成更长时间的工作。

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

启动/停止和绑定/解除绑定的组合确实允许对服务进行干净的管理。它将在需要时运行,并且只有在需要时才运行,并且您可以将所有API访问都保存在一个位置。

编辑:

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

因为运行服务的进程的排名高于进程对于后台活动,启动长时间运行的活动操作最好为该操作启动一个服务而不是简单地创建一个工作线程——特别是如果操作可能比活动更持久。。。

相关内容

最新更新