在单个进程中使用AsyncTask(或Timer)或在单独的进程中使用Service是否更好?

时间:2012-12-19 14:51:41

标签: android

我刚读过Android Architecture Tutorial: Developing an App with a Background Service (using IPC)。基本上是

  1. 让服务在单独的过程中运行。
  2. 服务中将发生重复的计时器事件。
  3. 在计时器事件处理程序中,它将执行网络以检索推文,并通知连接到它的所有侦听器。听众通过IPC附加到它。
  4. 我可以看到这种方法有两个主要特征。

    1. 在单独的流程中鸣叫检索行动。
    2. 它总是运行,即使主要活动已经退出。
    3. 但是,如果“始终运行”不是我的要求。当我退出主活动时,我希望一切都停止。

      1. 如果我在主Activity中使用AsyncTask(或Timer)来执行推文检索操作会更好吗?一切都将在一个过程中运行。不再使用Service
      2. 使用AsyncTask(或计时器),似乎更简单。我们不再需要处理IPC。
      3. 或者,使用Service方法可能会更好?我错过了服务提供的一些好东西吗?

4 个答案:

答案 0 :(得分:1)

使用服务是一种更好的方法,因为它允许您独立于应用程序流执行轮询。

由于这是一项不需要用户交互的任务,而且必须在后台完成而不会干扰应用程序的主UI以及用户正在做的任何事情,因此服务是实现它的理想候选者。

可以将服务与应用程序绑定,使得当主应用程序终止时,它也将关闭服务。

答案 1 :(得分:1)

首先,您必须知道服务不是线程。如果一个活动绑定一个服务并作为一个Deamon运行,但ASynchTask是另一个线程。

ASynchTask 用于完成一些不应在UI-Thread上运行的工作(例如处理一些较大的计算)

服务旨在在背景上永久运行。 如果您想要永久检查新推文,即使您的活动已停止或暂停,您也应该使用服务,该服务会检查自己的线程以获取新数据。

TimerTask 是在自己的线程上运行的优秀的旧式java实现。 您可以使用它们来处理某些数据,但是操作UI会遇到一些问题。如果你想在propper“AndroidWay”上使用它,请使用Handler而不是TimerTask。

答案 2 :(得分:1)

我认为可以将TimerTask设置为执行并以给定的间隔重复,Timer在一个单独的线程上运行,这样所有这些工作都会在后台发生而不会打扰UI。当TimerTask完成时,您可以轻松地在应用内触发更新,并在需要时更新UI。

退出应用时,只需在cancel()上调用Timer,然后使用purge()清除所有任务。

简单易用,您不需要实施IPC,这可能非常繁琐,无法正确使用。

修改

使用AsyncTask你几乎可以做同样的事情,但你必须手动安排下一次运行。我过去曾使用过这两种解决方案,并发现它们同样有效,所以这完全符合您的偏好。

答案 3 :(得分:0)

首先,我知道您正在关注的教程...我在尝试学习IPC时自己也遵循了该教程。您需要知道的一件事是,Android文档明确地说,

  

注意:仅当您允许来自不同应用程序的客户端访问IPC服务并希望在您的服务中处理多线程时,才需要使用AIDL。

如果可能的话,你应该bind to the service.

另外,你必须考虑,你真的需要一项服务吗?考虑到Android Twitter应用程序甚至不会根据需要为您刷新推文。轮询可能是电池密集型的,因此您必须考虑是否真的有必要。

另外,您是否会在多个活动中使用这些推文?如果是这样的话,不要在多个地方复制代码会很好。所以在这种情况下你可能想要一个服务。

除此之外,我建议你开始简单(带有计时器的异步任务来更新它),如果你认为需要它,就转移到服务。