서비스, ​​비동기 작업 및 스레드의 차이점은 무엇입니까?


147

서비스, ​​비동기 작업 및 스레드의 차이점은 무엇입니까? 내가 틀리지 않으면 그들 모두는 백그라운드에서 몇 가지 일을하는 데 사용됩니다. 그렇다면 언제 어떻게 사용할지 결정하는 방법은 무엇입니까?


사람들이 자주 혼란스러워 할 수있는 것이 하나 더있는 것 같습니다- 로더 . 관련 스레드 -Asynctask 대 스레드 대 서비스 대 로더
RBT

답변:


186

아마도 당신은 이미 그들에 대한 문서 설명을 읽었을 것입니다. 반복하지 않을 것입니다. 대신 내 말로 대답하려고 노력할 것입니다. 그들이 당신을 도울 것입니다.

  • 서비스는 활동과 유사하지만 사용자 인터페이스가 없습니다. 아마도 날씨를 가져 오려면 빈 활동을 만들지 않을 것입니다.이를 위해 서비스가 사용됩니다.

  • 스레드는 스레드입니다. 아마 다른 부분에서 이미 알고있을 것입니다. 스레드에서 UI를 업데이트 할 수 없다는 것을 알아야합니다. 이를 위해 핸들러를 사용해야하지만 추가 정보를 읽으십시오.

  • AsyncTask는 사용하도록 권장되는 지능형 스레드입니다. UI 메소드에서 도움을 줄 수있는 지능적이며 UI 스레드에서 실행되는 3 가지 메소드가 있으며 이는 UI 구성 요소를 업데이트하는 데 좋습니다.

서비스, ​​AsyncTasks를 자주 사용하고 있습니다. AsyncTask로 거의 모든 작업을 수행 할 수 있으므로 스레드가 적거나 전혀 없습니다.


1
설명해 주셔서 감사합니다. 따라서 웹에서 데이터를 가져 오는 응용 프로그램을 만들어야하는 경우 더 나은 옵션 서비스 또는 비동기 작업이 있습니까?
SpunkerBaba

16
둘 다 사용해야합니다. 서비스를 작성하고 그 내부에서 AsyncTask를 사용합니다.
Pentium10

4
위의 답변에 추가하여 AsyncTask는 onPreExecute (), onProgressUpdate (Progress ...) onPostExecute (Result), {UI 스레드에서 실행}, doInBackground (Params ...) {백그라운드 스레드에서 실행}의 4 단계를 거칩니다. UI 스레드에서 3 가지 메소드를 제공하므로 처리기 또는 콜백을 사용하여 UI를 업데이트하는 것에 대해 걱정할 필요가 없습니다.
SpunkerBaba

11
@ Pentium10 : Service + AsyncTask 대신 IntentService를 사용할 수 있습니다
njzk2

11
또한 기본적으로 Android 서비스는 기본 (UI) 스레드에서 실행됩니다. 서비스가 백그라운드에서 작동해야하는 경우 별도의 스레드 (또는 AsyncTask)에서 명시 적으로 시작해야합니다. 그렇지 않으면 UI 응답을 방해하고 응용 프로그램이 응답하지 않음 오류가 발생할 수 있습니다. 안드로이드의 서비스는 본질적으로 '보이지 않는'활동과 '미니어처'활동이며 반드시 '배경'노동자가 아닙니다.
CCJ

23

이것은 귀하의 질문에 대한 가장 쉬운 답변입니다

메인 스레드에 "병렬"을 실행하는 실행 단위 는 중요한 포인트입니다. 메인 스레드를 제외한 모든 스레드에서 UI 구성 요소를 업데이트 할 수 없습니다.

비동기 작업

는 특수 스레드로, UI를 업데이트하는 도우미 메소드를 제공 하므로 기본적으로 AsyncTask가 백그라운드 스레드에서 실행될지라도 UI를 업데이트 할 수 있습니다. 프로세스 간 통신 처리는 명시 적으로 수행 할 필요가 없습니다.

서비스

위의 문제는 활동을 호출 한 활동과 분리되어 있기 때문에 활동이 파괴 된 경우에도 계속 실행될 수 있기 때문에 메인 스레드에서 실행됩니다 (ANR을주의하십시오) 백그라운드 서비스를 사용하십시오 (IntentService를 확장하면 작업자 스레드를 자동으로 만듭니다) 당신을 위해) . 서비스는 UI없는 활동과 같 으며 긴 작업에 좋습니다.


4
AyncTask는 디바이스가 Activity 라이프 사이클 메소드와 동기화되지 않기 때문에 디바이스를 회전 할 때 다시 작성되지 않습니다.
CopsOnRoad

4
활동 수명주기 후크에서 AsyncTask를 작성하고 전화기를 회전하면 활동이 소멸되고 다시 시작됩니다. AsyncTask의 이전 인스턴스는 방금 파괴 한 액티비티에 연결되어 있으므로 "Force Close"가 표시되지만 AsynTask의 새 인스턴스가 다시 트리거되는 방법도 볼 수 있습니다. Fragments를 사용하여 AsyncTask를 유지하고 Fragment에서 도움이 될 setRetainInstance (true)를 설정할 수 있습니다.
Alejandro Serret

15

누군가가 며칠 전에 나에게 말한 더 많은 정보는 다음과 같습니다.

  • 활동과 서비스간에 스레드와 같은 전역 변수를 공유 할 수 있습니다.
  • 귀하의 응용 프로그램 의 모든 전역 변수와 함께이 오래 여전히 거기에 활동 또는 서비스로 전멸되지 않습니다.
  • 앱에 서비스 인스턴스가 있고 OS에 리소스가 필요한 경우 먼저 활동을 종료하지만 서비스가있는 한 OS는 전역 변수와 함께 애플리케이션을 삭제하지 않습니다.

내 유스 케이스는 다음과 같습니다. 전역 공간에 서버에 연결된 하나의 스레드와 결과를 보여주는 활동이 있습니다. 사용자가 홈 버튼을 누르면 활동이 백그라운드로 이동하고 새 서비스가 시작됩니다. 그런 다음이 서비스는 스레드에서 결과를 읽고 필요한 경우 알림 영역에 정보를 표시합니다. 서비스가 실행되는 동안 스레드가 파괴된다는 것을 알고 있기 때문에 OS가 내 활동을 파괴하는 것에 대해 걱정하지 않습니다.


9

요컨대, Service for time consuming tasks, AsyncTask for short-lived tasks, Threadstandard java construction스레드 용입니다.


3

개발자의 관점에서 :

스레드 : 메인 스레드와 병렬로 코드 세트를 실행하는 데 사용됩니다. 그러나 스레드 내부의 UI를 처리 할 수 ​​없습니다. 이를 위해서는을 사용해야 Handler합니다. Hadler는 스레드처럼 작동하지만 UI도 처리 할 수 ​​있습니다.

ASyncTask : 메인 스레드에서 작업 할 수없는 작업을 처리하는 데 사용됩니다. 예를 들어, HTTP 요청은 주 스레드에서 처리 할 수없는 매우 무거운 작업이므로 HTTP 요청을 처리합니다 .It은 HTTP ASyncTask스레드를 백그라운드에서 기본 스레드와 병렬로 작동합니다. 이벤트.

서비스 : 백그라운드 프로세스입니다. 연관된 UI가없는 일부 처리를 수행해야 할 때 사용됩니다.


1
Service를 사용하지 않으면 백그라운드에서 실행할 필요가 없습니다 IntentService. ServiceUiThread에서 표준을 시작한 경우 UiThread에서 실행됩니다.
yshahak

@yshahak 당신은 정확하지만 여기서는 깊은 정의가 필요하지 않습니다. 사용자는 단지 그들 사이의 차이점을 알고 싶어합니다.
Rahul Raina

예, 그러나 Service기본적으로 다른 프로세스에서 실행되지 않지만 다른 구성 요소와의 앱 프로세스에서 실행 되므로 정확 하지 않습니다. Service그것이 스레드 내부의 배경에서 실행될 것이라고 말하는 것이 좋습니다.
yshahak

위의 세 가지 모두 응용 프로그램 프로세스 내에서 작동합니다. ASyncTask의 preExecute () 및 postExecute () 메소드는 UIThread에서 작동하며 doInBackground () 및 onProgress ()는 백그라운드 스레드에서 작동합니다. 서비스는 백그라운드 스레드에서 작동하고 스레드는 백그라운드 스레드에서도 작동합니다. 그러나 핸들러는 UI 스레드에서 작동합니다.
Rahul Raina

2

서비스는 활동이 오래 걸리는 작업과 비슷하지만 비동기 작업을 통해 긴 백그라운드 작업을 수행하고 스레드를 조작하지 않고도 UI 스레드에 결과를 표시 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.