2010-04-13 5 views
27

활동이나 서비스의 스레드에있는 긴 네트워크 액세스 코드를 배치 할 때 장단점은 무엇입니까? 응용 프로그램에 어떤 영향을 미칩니 까? 내가 스트리밍 오디오 플레이어를 쓰고 있는데, 지금까지 읽은 것에서 코드를 서비스에 넣으면 여전히 응용 프로그램을 차단하여 새로운 스레드가 필요하게됩니다.이 코드를 넣는 것이 더 합리적인지 알 수 있습니까? 서비스에서.응용 프로그램 스레드 대 서비스 스레드

답변

35

예, 서비스의 차단 작업은 여전히 ​​응용 프로그램을 차단합니다. 처음 모습을 보였음에도 불구하고 서비스는 백그라운드에서 작업을 실행하기위한 것이 아닙니다. 활동 라이프 사이클과 관계없는 라이프 사이클 (IE는 활동이 종료 된 후에도 계속 진행될 수 있음)을 사용하여 작업을 실행하기위한 것입니다.

활동이 끝나면 활동이 시작되고 끝날 때 시작되는 서비스는 쓸모가 없습니다.

오디오를 스트리밍하는 경우 사용자가 활동을 종료 한 후에도 오디오를 스트리밍하려는 경우 서비스를 사용해야하지만 여전히 스레드가 필요합니다 (또는 AsyncTask).

+0

고마워, 그게 내가 생각한거야. 적어도 에뮬레이터에서는 스트리밍 플레이어를 시작한 후에 뒤로 버튼을 누른 후에도 계속 재생됩니다. 나는 액티비티가 전경에 없어 졌을 때 멈출 것이라고 추측했다. 새로운 스레드 때문이거나 안드로이드가 애플리케이션을 죽일 때까지 아무런 반응을 보이지 않을 것이다. – zerayaqob

+0

예, Android가 죽일 때까지 스레드가 계속 실행됩니다. 멈추고 싶다면 onDestroy() 메서드에서 일종의 "활성"플래그를 구현하고 false로 설정하십시오. – synic

+3

또한 'Activity'의 스레드는 구성 (읽기 : 방향)이 변경되면 파괴됩니다! 이것은'Service'의 쓰레드에는 맞지 않습니다. – MrSnowflake

1

Android (1 년 이상 개발 중)에서 경험 한 바에 따르면 서비스 또는 활동에 새 스레드를 실행하는 데 차이가 없습니다. 새 스레드에서 활동에 대한 참조를 유지하지 않으려는 시도 - 응용 프로그램 컨텍스트를 사용하십시오.

또한, 서비스의 라이프 사이클은 모두 몇 가지 방법이 호출 할 :(보장되지 않기 때문에 도움이되지 않았다

유일한 차이점은 서비스가 완전히 응용 프로그램을 파괴하지 않고 파괴 될 수 있다는 것을있을 수 있습니다 - 따라서 잠재적 새로운 스레드를 파괴 실제적인면에이 발생하지 않기 때문에 응용 프로그램 는 항상, 그 전에 서비스를 죽이는 의미없이을 살해됩니다 왜 잠재적 :..? 로컬 서비스 메커니즘은 쓸모입니다! !

원격 서비스는 다른 토론입니다. "새 스레드를 어디에서 실행해야합니까?"

행운을 빌어 요 !!!

+0

동일한 작업을 수행하기 위해 작업에서 새 스레드를 실행하는 대신 서비스에서 새 스레드를 실행해야하는 상황을 줄 수 있습니까? – committedandroider

+0

@committedandroider 1GB의 파일을 다운로드하도록 브라우저 앱과 사용자가 선택했다고 가정 해보십시오. 사용자는 브라우저 앱을 열어 두지 않고 파일이 다운로드 될 때까지 대기합니다. 그는 단순히 다운로드를 시작하고 앱을 종료합니다.이 경우 Activity에서 생성 된 스레드가 더 이상 실행되지 않으므로 서비스에서 스레드를 생성해야합니다. – CopsOnRoad

+0

@Jack yea 의미가 있습니다. 이것은 오래 전 일이었습니다. – committedandroider