2012-08-08 91 views
7

在我的Android應用程序的服務類中調用REST WebService創建NetworkOnMainThreadExceptionAndroid:在服務中使用網絡

我明白爲什麼在Activity中引發這個異常:通過網絡同步獲取某些東西是一個非常糟糕的做法,但我很驚訝地發現服務類中出現同樣的錯誤。 所以我的問題是:

- 在這個特定的情況下,我應該使用StrictMode.setThreadPolicy()來允許這個調用。 (而對於那些讀這一點,因爲他們已經在活動中遇到這個錯誤,不要使用StrictMode隱藏這個錯誤,使用的AsyncTask)

- 或者我應該使用的AsyncTask?在那種情況下,這裏有什麼問題?線程上的服務不是與Activity的線程分開的嗎?

回答

12

儘管Service用於後臺處理,但它們仍在主線程中運行。

documentation短報價:

小心:服務運行在相同的工藝,聲明它的應用程序,並在該應用程序的主線程,默認情況下。因此,如果您的服務在用戶與來自同一應用程序的活動進行交互時執行密集或阻止操作,則該服務會降低活動性能。爲了避免影響應用程序性能,您應該在服務中啓動一個新線程。

'後臺處理'表示服務沒有用戶界面,即使用戶沒有直接與應用程序交互,它也可以運行。但是默認情況下,所有後臺處理仍然在主線程中發生。

那麼,如何解決它並擺脫異常呢?正如文檔建議你必須使用後臺線程。在您的服務中,您可以使用AsyncTask或直接創建線程。但我想IntentService可能是最適合你的情況。 IntentService在後臺線程中處理請求(這是您尋找的服務類型)。

+0

感謝您的回答,所以這就是我所懷疑的。我認爲,因爲它們用於後臺任務服務默認會在另一個線程上,但事實並非如此。 其實我使用該服務來管理對'MediaPlayer'的調用,所以在主線程中聽起來不會有問題,因爲'prepareAsync()'允許我優雅地管理它的行爲。 我只需要修改我的服務,以便使用'AsyncTask'來獲取流網址。 – Teovald 2012-08-09 10:51:20

+1

好的答案,也有可用的材料,可以幫助您瞭解如何有效地使用網絡,以確保您的應用程序得到優化。 http://developer.att.com/developer/forward.jsp?passedItemId=7200042 – 2012-08-13 13:57:07