2012-08-08 3 views
7

내 Android 앱의 서비스 클래스에서 REST WebService를 호출하면 NetworkOnMainThreadException이 생성됩니다.Android : 서비스에서 네트워크 사용

필자는 Activity에서이 예외가 발생하는 이유를 알고 있습니다. 네트워크를 통해 동 기적으로 가져 오는 것은 매우 나쁜 습관이지만 서비스 클래스에서 같은 오류가 발생하는 것은 놀랍습니다. 제 질문은 :

-이 특별한 경우이 전화를 허용하려면 StrictMode.setThreadPolicy()을 사용해야합니까? (활동에서이 오류가 발생했기 때문에이를 읽은 사용자는 StrictMode를 사용하여이 오류를 숨기지 말고 AsyncTask를 사용하십시오.)

- 또는 AsyncTask를 사용해야합니까? 그리고 그 경우에, 여기에 문제가 무엇입니까? 스레드의 서비스가 활동의 스레드와 분리되어 있지 않습니까?

답변

12

Service은 백그라운드 처리 용으로 사용되지만 메인 스레드에서 실행됩니다.

documentation에서 짧은 인용 :

주의 : 서비스는 기본적으로,이 선언 된 응용 프로그램과 동일한 프로세스에서 해당 응용 프로그램의 주 스레드에서 실행됩니다. 따라서 사용자가 동일한 응용 프로그램의 활동과 상호 작용하는 동안 서비스가 집중적 인 또는 차단 작업을 수행하면 서비스의 활동 성능이 저하됩니다. 응용 프로그램 성능에 영향을주지 않으려면 서비스 내에서 새 스레드를 시작해야합니다.

'백그라운드 처리'는 서비스에 사용자 인터페이스가 없으며 사용자가 직접 응용 프로그램과 상호 작용하지 않아도 실행할 수 있음을 의미합니다. 그러나 모든 백그라운드 처리는 여전히 기본적으로 주 스레드에서 발생합니다.

그래서 문제를 해결하고 예외를 제거하는 방법은 무엇입니까? 문서에서 알 수 있듯이 백그라운드 스레드를 사용해야합니다. 서비스에서는 AsyncTask을 사용하거나 직접 스레드를 작성할 수 있습니다. 그러나 나는 IntentService이 귀하의 경우에 가장 적합하다고 생각합니다. IntentService은 백그라운드 스레드에서 요청을 처리하므로 (찾고있는 서비스 종류)

+0

답변 해 주셔서 감사합니다. 나는 그들이 백그라운드 작업에 사용되기 때문에 서비스가 기본적으로 다른 스레드에 있다고 가정했으나 그렇지 않습니다. 실제로 'MediaPlayer'에 대한 호출을 관리하기 위해이 서비스를 사용합니다. 'prepareAsync()'를 사용하면 주 스레드에서 문제가 발생하지 않으므로 문제를 우아하게 처리 할 수 ​​있습니다. 'AsyncTask'를 사용하여 스트리밍 URL을 얻으려면 서비스를 수정해야합니다. – Teovald

+1

좋은 답변입니다. 앱을 최적화하기 위해 네트워크를 효율적으로 사용하는 방법을 이해하는 데 도움이되는 자료도 있습니다. http://developer.att.com/developer/forward.jsp?passedItemId=7200042 –

관련 문제