2012-04-08 86 views
4

在ICS上,當使用UrlConnection時,我得到了一個android.os.NetworkOnMainThreadException錯誤 - 即使我在運行它自己的進程的服務中發出這個請求,並通過Messenger被異步調用。android.os.NetworkOnMainThreadException在一個單獨的進程中的服務

更改StrictPolicy沒有效果,我仍然得到錯誤。

我該怎麼辦?

編輯:此服務運行在一個單獨的過程 - 有一個不同的PID和一切。

回答

4

服務仍然是主要的線程上運行,具體根據該documentation

需要注意的是服務,如其他應用程序對象,在其宿主進程的主線程中運行。這意味着,如果你的服務要做任何CPU密集型(如MP3播放)或阻塞(如網絡)操作,它應該產生自己的線程來完成這項工作。有關這方面的更多信息可以在「進程和線程」中找到。 IntentService類可作爲Service的標準實現提供,它具有自己的線程,用於調度要完成的工作。

因此,對於長時間運行的任務(例如使用UrlConnection),您應該使用類似於IntentService的東西或自己產生新的線程。

+2

此服務在單獨的進程中運行。 – Vadi 2012-04-08 21:44:58

+0

如果它在與其他活動或服務分開的進程中運行,則無關緊要 - 直接在服務中運行的任何代碼仍將在該進程的主線程中執行。如果您使用IntentService,則會爲您在onHandleIntent()中執行的代碼自動創建一個新的線程。 – AdamK 2012-04-09 11:46:24

+0

所以你說的是一個任務,在一個完全獨立於主進程的進程中運行的服務的定時器 - 會影響主進程的UI線程? 我沒有注意到這種行爲,我的UI不凍結,而網絡正在發生...... – Vadi 2012-04-09 21:02:24

0

在那裏做一個Thread網絡的東西。此例外是爲了防止一些問題,如UI凍結(由於網絡作業,可能需要時間)。