1

我有一个AsyncTask执行的服务。由于AsyncTask在单独的线程中运行,我几乎没有疑问:

  1. onStartCommand()如果在执行 AsyncTask 时服务方法返回会发生什么?执行时服务是否关闭AsyncTask?如何最好地解决这种情况?,我应该使用 START_STICKY 吗?

  2. 由于onPostExecute()在 UIThread 上运行,它会在与服务onStartCommand方法相同的线程上运行吗?AsyncTask如果在服务关闭时仍在运行,在上述情况下会发生什么。哪个线程会onPostExecute()

Update:

我使用 Service 的原因是因为 Service 是从onReceive广播接收器的方法实例化的。我同意我可以在 onReceive 中使用一个普通线程,但 service-AsyncTask 模式似乎更好,因为我还需要触发一些通知,我正在onPreExecuteonPostExecute.

4

1 回答 1

3

我有一个从服务执行的 AsyncTask

由于您很少需要在 a 中处理主应用程序线程Service,因此我建议您只使用普通线程。

如果在执行 AsyncTask 时 service onStartCommand() 方法返回会发生什么?

没有。

执行 AsyncTask 时服务是否关闭?

onStartCommand()在向服务发送命令时调用。关闭服务时不会调用它。

我应该使用 START_STICKY 吗?

这是不可能抽象地回答的。如果您需要稍后重新启动服务(例如,当可用内存增加时),请使用它。

由于 onPostExecute() 在 UIThread 上运行,它会在与服务相同的线程上运行吗?

对象不在 Java 中的线程上运行。因此,服务不会在线程上运行。方法在线程上运行。

如果在服务关闭时 AsyncTask 仍在运行,在上述情况下会发生什么。

这取决于您,因为您是唯一关闭服务的人。

如果操作系统出于其他原因摆脱了该服务,它往往会通过终止整个进程来做到这一点,在这种情况下,它AsyncTask也会消失。

onPostExeceucte() 会在哪个线程上执行?

onPostExecute()在主应用程序线程上运行。由于在 中很少需要,甚至是一个好主意,Service请考虑使用普通线程而不是AsyncTask.

更好的是IntentService,如果你的工作本质上是事务性的(例如,需要运行几秒钟,那么工作就完成了,不再需要服务),因为IntentService它有自己的后台线程,所以你不需要你的。

更新

我使用 Service 的原因是因为 Service 是从广播接收器的 onReceive 方法实例化的

那与任何事情都无关。

我还需要在 onPreExecute 和 onPostExecute 中触发一些通知。

Notification您可以从后台线程中引发 a 。您不需要从主应用程序线程执行此操作。

于 2013-10-18T00:01:36.873 回答