여기 대부분의 질문에 대한 답 약을 많이 읽어 않는 이유 AsyncTask
에 대한 및 로더 아무것도하지만 서비스 ? 서비스가 잘 알려지지 않았거나 더 이상 사용되지 않거나 나쁜 속성이나 무언가가 있습니까? 차이점은 무엇입니까?
(그런데, 나는 그것에 관한 다른 스레드가 있다는 것을 알고 있지만, 실제 문제에 대해 하나 또는 다른 것을 사용하는 것이 더 나은지 개발자가 쉽게 결정할 수있는 명확한 차이점은 없습니다.)
답변
어떤 경우에는 하나와 동일한 작업을 수행하는 것이 가능 AsyncTask
하거나 Service
그러나 일반적으로 하나가 더 이상 다른 작업에 적합하다.
AsyncTask
UI 스레드를 실행할 수없는 일회성 시간 소모적 인 작업을 위해 설계되었습니다. 일반적인 예는 버튼을 눌렀을 때 데이터를 가져 오거나 처리하는 것입니다.
Service
s는 백그라운드에서 지속적으로 실행되도록 설계되었습니다. 버튼을 눌렀을 때 데이터를 가져 오는 위의 예에서 서비스를 시작하고 데이터를 가져온 다음 중지 할 수는 있지만 비효율적입니다. AsyncTask
한 번 실행되고 데이터를 반환하고 완료 되는 것을 사용하는 것이 훨씬 빠릅니다 .
그래도 백그라운드에서 무언가를 계속 해야하는 경우 a Service
가 가장 좋습니다. 음악 재생, 지속적으로 새로운 데이터 확인 등이 여기에 해당합니다.
또한 Sherif가 이미 말했듯이 서비스가 반드시 UI 스레드에서 벗어날 필요는 없습니다.
대부분 Service
의 경우 응용 프로그램 Activity
이 열려 있지 않은 경우에도 코드를 실행하려고합니다 . AsyncTask
UI 스레드에서 코드를 실행하는 것이 매우 간단하도록 설계되었습니다.
답변
서비스 는 완전히 다릅니다. 서비스는 스레드 가 아닙니다 !
활동은 서비스에 바인딩되며 서비스에는 호출 될 때 호출 스레드를 차단하는 일부 기능이 포함됩니다. 서비스는 온도를 섭씨에서 도로 변경하는 데 사용될 수 있습니다. 바인드 된 모든 활동이이 서비스를받을 수 있습니다.
그러나 AsyncTask
백그라운드에서 일부 작업을 수행하는 동시에 스레드는 결과를 호출 스레드에 다시보고하는 기능이 있습니다.
단지 생각 : 서비스 에는 AsyncTask
객체 가있을 수 있습니다 !
답변
Service
UI 실행을 요구하지 않는 Android 프레임 워크의 구성 요소 중 하나입니다. 즉, 사용자가 앱을 적극적으로 사용하지 않는 경우에도 서비스를 통해 일부 작업을 수행 할 수 있습니다. 그렇다고해서 서비스가 별도의 스레드에서 실행되는 것은 아니지만 메인 스레드에서 실행되며 필요한 경우 별도의 스레드에서 작업을 수행 할 수 있습니다. 예를 들어 백그라운드에서 음악을 재생하고 사용자 상호 작용없이 backgroud에서 서버와 데이터를 동기화하는 등
AsyncTask
반면에 별도의 스레드에서 수행되는 UI 차단 작업에 사용됩니다. 스레드를 만들고 유지 관리하고 결과를 기본 스레드로 다시 전송하는 모든 작업이 AsyncTask에 의해 처리 될 때 새 스레드를 만들고 작업을 수행하는 것과 같습니다.
답변
서비스 와 asynctasks 는 거의 똑같은 일을하고 있습니다. 거의 .service 또는 asynctask 사용은 요구 사항에 따라 다릅니다.
예를 들어 일부 버튼을 누르거나 화면을 변경 한 후 서버에서 목록보기로 데이터를로드하려는 경우 asynctask.it을 사용하는 것이 좋습니다. 기본 ui 스레드와 병렬로 실행됩니다 (배경에서 실행). 기본 UI 스레드에서 앱을 종료 한 후 비동기 작업이 없습니다.
그러나 서비스는 서비스를 중지하면 서비스를 중지하지 않는 한 서비스를 시작한 후 앱을 종료 한 후에 실행할 수 있습니다. 서비스 요구 사항에 따라 달라집니다. 데이터 수신을 계속 확인하거나 네트워크 상태를 확인하려면 지속적으로 서비스를받는 것이 좋습니다.
행복한 코딩.
답변
경우에 따라 두 가지를 모두 사용하여 동일한 기능을 수행 할 수 있습니다. 비동기 작업과 달리 서비스는 자체 수명주기를 가지며 컨텍스트를 상속합니다 (서비스는 비동기 작업보다 강력합니다). 앱을 종료 한 경우에도 서비스를 실행할 수 있습니다. 앱을 닫은 후에도 무언가를하고 컨텍스트 변수가 필요하면 서비스를 받으십시오.
예 : 음악을 재생하려고하고 사용자가 앱을 떠날 때 일시 중지하지 않으려면 서비스를 받아야합니다.
답변
(A)의 비교 지역에서 프로세스, 기본 클래스 서비스 에 ✱AsyncTask
:
✱ (이 답변은 내 보낸 서비스 또는 클라이언트와 다른 프로세스에서 실행되는 서비스를 다루지 않습니다. 예상되는 사용 사례는의 사용 사례와 크게 다르기 때문 AsyncTask
입니다. 또한 간결성을 위해 특정 전문의 특성 Service
서브 클래스 (예를 들어 IntentService
, JobService
) 여기에 무시됩니다.)
공정 수명
A Service
는 OS에게 “사용자와 상호 작용하지 않으면 서 더 오래 실행되는 작업을 수행하려는 응용 프로그램의 요구”[ ref ]를 나타냅니다.
Service
실행중인 동안 Android는 프로세스가 종료되는 것을 원하지 않는다는 것을 이해합니다. Activity
화면이 나타날 때마다 마찬가지 이며, 포 그라운드 서비스를 실행할 때 특히 그렇습니다 . (모든 애플리케이션 구성 요소 가 사라지면 Android는 “아, 이제이 앱을 종료하기에 좋은시기이므로 리소스를 확보 할 수 있습니다”라고 생각합니다.)
또한의 마지막 반환 값에 따라 Service.onCreate()
Android는 리소스 압력으로 인해 종료 된 앱 / 서비스를 “복원”할 수 있습니다 [ ref ].
AsyncTasks
그 어떤 것도하지 마십시오. 실행중인 백그라운드 스레드 수 또는 작동 속도는 중요하지 않습니다. Android는 앱이 CPU를 사용한다고해서 앱을 계속 유지하지 않습니다. 앱이 여전히해야 할 일 이 있다는 것을 알 수있는 방법이 있어야합니다. 이것이 Services
OS에 등록 된 이유입니다.AsyncTasks
입니다.
멀티 스레딩
AsyncTasks
작업을 수행 할 백그라운드 스레드를 작성하고 해당 작업의 결과를 스레드 안전 방식으로 UI 스레드에 표시하는 것입니다.
각각의 새로운 AsyncTask
실행은 일반적으로 AsyncTasks's
스레드 풀 의 제한에 따라 더 많은 동시성 (더 많은 스레드)을 초래 합니다 [ ref ].
Service
반면에, 메소드는 항상 UI 스레드 [ ref ] 에서 호출됩니다 . 이 정보는 다음의 제품에 적용 onCreate()
, onStartCommand()
, onDestroy()
, onServiceConnected()
, 등 따라서는, 어떤 의미에서, Services
백그라운드에서하지 “실행”할. 그들이 시작되면 ( onCreate()
), 그들은 단지 거기에 “앉아”있습니다. 정리할 때까지,onStartCommand()
.
즉, 추가를 추가 Services
해도 동시성이 향상되지 않습니다. 서비스 메소드는 UI 스레드에서 실행 되기 때문에 많은 양의 작업을 수행하기에 적합하지 않습니다 .
물론, 확장 Service
하고 자신 만의 메소드를 추가하고 원하는 스레드에서 호출 할 수 있습니다. 그러나 그렇게하면 스레드 안전에 대한 책임은 프레임 워크가 아니라 사용자에게 있습니다.
에 백그라운드 스레드 (또는 다른 종류의 워커)를 추가하려는 경우 Service
자유롭게 추가 할 수 있습니다. 예를 들어 백그라운드 스레드 / AsyncTask
in을 시작할 수 Service.onCreate()
있습니다. 그러나 모든 유스 케이스에 이것이 필요한 것은 아닙니다. 예를 들면 다음과 같습니다.
Service
“배경”에서 위치 업데이트를 계속받을 수 있도록 계속 달리기를 원할 수 있습니다 (즉,Activities
화면이 없어도 됨 ).- 또는
BroadcastReceiver
장기적으로 “암시 적” 등록을 유지할 수 있도록 앱을 계속 유지하고 싶을 수도 있습니다 (API 26 이후에는 항상 매니페스트를 통해이 작업을 수행 할 수 없으므로 런타임시 대신 등록해야 함) [ ref ]).
이러한 사용 사례 중 어느 것도 많은 CPU 활동을 요구하지 않습니다. 그들은 단지 응용 프로그램을 죽일 필요가 없습니다 .
노동자로서
Services
작업 지향적이지 않습니다. “작업 수행”및 “결과 제공”과 같이 설정되지 않았습니다 AsyncTasks
. Services
모든 메소드가 단일 스레드에서 실행된다는 사실에도 불구하고 스레드 안전성 문제를 해결하지 마십시오. AsyncTasks
반면에 복잡성을 처리하십시오.
참고 AsyncTask
됩니다 중단 될 예정 . 그러나 이것이 당신 AsyncTasks
을 당신 으로 대체해야한다는 것을 의미하지는 않습니다 Services
! (이 답변에서 무엇이든 배운다면 그 점이 분명해야합니다.)
TL; DR
Services
대부분 “존재”합니다. Activity
다른 구성 요소가 “작업”을 처리하는 동안 앱은 계속 살아있는 이유를 제공 하는 오프 스크린과 같습니다 . AsyncTasks
“일”을하되, 그 자체로 프로세스가 살아 있지는 않을 것입니다.