2013-10-17 104 views
1

我有一個AsyncTask從服務執行。因爲在一個單獨的線程運行AsyncTask,我有幾個疑惑:從服務執行AsyncTask

  1. 如果執行,而服務的AsyncTask方法onStartCommand()回報會發生什麼?在執行AsyncTask時服務是否關閉? 如何最好地解決這種情況?我應該使用START_STICKY嗎?

  2. 由於在UIThread上運行,它會運行在與服務的onStartCommand方法相同的線程上嗎?如果在服務關閉時AsyncTask仍在運行,那麼以上情況會發生什麼情況。 onPostExecute()上哪個線程?

Update:

我使用服務的原因是因爲服務是從廣播接收器的方法onReceive實例化。我同意我可以在onReceive中使用普通線程,但服務-AsyncTask模式似乎更好,因爲我需要發出一些通知,以及我在onPreExecuteonPostExecute中執行的一些通知。

回答

3

我有一個服務

因爲你很少需要在Service主應用程序線程上運行執行的的AsyncTask,我只想用一個普通的線程建議。

如果服務onStartCommand()方法在執行AsyncTask時返回會發生什麼?

什麼都沒有。

AsyncTask執行時服務是否關閉?

onStartCommand()在服務發送命令時被調用。服務關閉時不會調用它。

我應該使用START_STICKY嗎?

這是不可能在摘要中回答的。如果您需要稍後重新啓動服務(例如,當可用內存改進時),請使用它。

由於onPostExecute()在UIThread上運行,它是否會在與服務相同的線程上運行?

對象不在Java中的線程上運行。因此,服務不會在線程上運行。方法在線程上運行。

如果在服務關閉的情況下AsyncTask仍在運行,上述情況會發生什麼。

這取決於你,因爲你是唯一一個關閉服務的人。

如果操作系統因其他原因擺脫了服務,它會傾向於終止整個過程,在這種情況下AsyncTask也不見了。

哪個線程在onPostExeucte()上?

在主應用程序線程上運行。由於這是很少需要的,或者甚至是一個好主意,請在Service中考慮使用普通線程而不是AsyncTask

更好的是,如果您的工作本質上是事務性的(例如,需要運行幾秒鐘,然後工作完成並且不再需要該服務),那麼使用IntentService,因爲IntentService帶有其自己的後臺線程,所以你不需要你的。

UPDATE

我使用服務的原因是因爲服務是從廣播接收機

這已無關,與任何一個的onReceive方法實例化。

我需要觸發一些通知,以及我在onPreExecute和onPostExecute中做的事情。

您可以從後臺線程中調出Notification。您不需要從主應用程序線程執行此操作。

+0

感謝您的回答。我更新了我的問題。 –

+0

@MadhurAhuja:我已經更新了我的答案。 – CommonsWare