4

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

  1. 让服务在单独的进程中运行。
  2. 服务中将发生重复的计时器事件。
  3. 在计时器事件处理程序中,它将执行网络以检索推文,并通知所有附加到它的侦听器。侦听器通过 IPC 附加到它。

我可以看到这种方法有两个主要特点。

  1. 推文检索操作在单独的进程中运行。
  2. 它总是运行,即使主要活动已经退出。

但是,如果“它总是运行”不是我的要求。当我退出主要活动时,我希望一切都停止。

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

4 回答 4

1

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

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

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

于 2012-12-19T14:58:00.667 回答
1

首先你必须知道,服务不是线程。如果一个活动绑定了一个Service并作为一个Deamon运行,但是一个异步任务是另一个线程。

异步任务是为做一些不应该在 UI 线程上运行的工作而设计的(例如处理一些更大的计算)

服务被设计为在后台永久运行。如果您想永久检查新推文,即使您的活动已停止或暂停,您也应该使用服务,它会检查自己的线程以获取新数据。

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

于 2012-12-19T15:02:17.040 回答
1

我认为 aTimerTask可以设置为以给定的时间间隔执行和重复,Timers 在单独的线程上运行,因此所有这些工作都将在后台进行,而不会干扰 UI。您可以轻松地在应用程序TimerTask完成时触发更新,并在需要时更新 UI。

当您退出应用程序时,这是一个简单的案例,调用cancel()您的Timer并清除所有任务purge()

很好很容易,而且你不需要实现 IPC,这可能非常繁琐。

编辑

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

于 2012-12-19T15:03:41.690 回答
0

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

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

如果可能的话,您应该只绑定到服务。

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

另外,你会使用来自多个活动的这些推文吗?如果是这样,最好不要在多个地方复制代码。因此,在这种情况下,您可能确实需要服务。

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

于 2012-12-19T15:21:25.260 回答