AsyncTask是从Service执行的

时间:2013-10-17 23:55:11

标签: android android-asynctask

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

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

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

  3. Update:

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

1 个答案:

答案 0 :(得分:3)

  

我有从服务执行的AsyncTask

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

  

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

没有

  

执行AsyncTask时服务是否会关闭?

在向服务发送命令时调用

onStartCommand()。服务关闭时不会调用它。

  

我应该使用START_STICKY吗?

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

  

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

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

  

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

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

如果操作系统由于其他原因而摆脱了服务,它将倾向于通过终止整个过程来完成,在这种情况下,AsyncTask也会消失。

  

onPostExeucte()上会有哪个线程?

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

更好的是,使用IntentService,如果您的工作本质上是事务性的(例如,需要运行几秒钟,然后工作完成并且不再需要服务),{{1}有自己的后台线程,所以你不需要你的。

<强>更新

  

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

这与任何事都无关。

  

我需要发出一些通知,我正在onPreExecute和onPostExecute中进行。

您可以从后台主题提升IntentService。您不需要从主应用程序线程中执行此操作。