我从服务中执行了AsyncTask
。由于AsyncTask
在一个单独的线程中运行,我几乎没有疑问:
如果在执行AsyncTask时service onStartCommand()
方法返回会发生什么?执行AsyncTask
时服务是否关闭?
如何最好地解决这种情况?,我应该使用START_STICKY吗?
由于onPostExecute()
在UIThread上运行,它是否会在与服务的onStartCommand
方法相同的线程上运行?如果AsyncTask
在服务关闭时仍在运行,上述情况会发生什么。 onPostExecute()
在哪个帖子上?
Update:
我使用Service的原因是因为Service是从广播接收器的onReceive
方法实例化的。我同意我可以在onReceive中使用一个普通的线程但是服务-AsyncTask模式似乎更好一个,因为我需要发出一些通知我正在onPreExecute
和onPostExecute
答案 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
。您不需要从主应用程序线程中执行此操作。