태그 보관물: multithreading

multithreading

안드로이드 플랫폼에서 서비스 대 IntentService IntentService 할

나는 할 수있는 일의 예를 찾고 있습니다. IntentService 할 수없는Service 있습니까?

또한 IntentService다른 스레드에서 실행되고 Service그렇지 않은 것으로 생각합니다. 내가 볼 수있는 한, 자체 스레드 내에서 서비스를 시작하는 것은를 시작하는 것과 같습니다 IntentService. 그 맞습니까?



답변

Tejas Lagvankar는 멋진 게시물을 작성했습니다 이 주제에 관해 . 다음은 Service와 IntentService의 주요 차이점입니다.

언제 사용합니까?

  • 서비스는 어떤 UI와 작업에 사용할 수 있지만, 너무 오래해서는 안됩니다. 긴 작업을 수행해야하는 경우 서비스 내에서 스레드를 사용해야합니다.

  • IntentService은 일반적으로 주 스레드없이 통신 긴 작업에 사용할 수 있습니다. 통신이 필요한 경우 기본 스레드 핸들러 또는 브로드 캐스트 의도를 사용할 수 있습니다. 또 다른 사용 사례는 콜백이 필요한 경우입니다 (의도적으로 트리거 된 작업).

트리거하는 방법?

  • 서비스는 메서드를 호출하여 실행됩니다 startService().

  • IntentService는 이 새 작업자 스레드를 생성합니다 및 방법은, 인 텐트를 사용하여 트리거 방식입니다 onHandleIntent()이 스레드에서 호출됩니다.

트리거

  • 서비스IntentService는 어떤 스레드, 활동 또는 다른 응용 프로그램 구성 요소에서 트리거 될 수 있습니다.

에 실행

  • 서비스는 백그라운드에서 실행하지만 응용 프로그램의 메인 스레드에서 실행됩니다.

  • IntentService은 별도의 작업자 스레드에서 실행됩니다.

한계 / 단점

  • 서비스는 응용 프로그램의 주 스레드를 차단할 수 있습니다.

  • IntentService는 병렬로 작업을 실행할 수 없습니다. 따라서 모든 연속 의도는 작업자 스레드의 메시지 큐로 이동하여 순차적으로 실행됩니다.

언제 멈출 까?

  • 당신이 구현하는 경우 서비스를 , 그것의 작업이 호출하여 수행하는 경우 서비스를 중지하는 것은 귀하의 책임입니다 stopSelf()또는 stopService(). 바인딩 만 제공하려는 경우이 메소드를 구현할 필요가 없습니다.

  • IntentService은 당신이 전화를하지 않아도되도록 모든 시작 요청이 처리 된 후 서비스를 중지합니다 stopSelf().


답변

누군가 나에게 할 수 있고 다른 방법으로 IntentService는 할 수없는 일의 예를 보여줄 수 있다면 Service.

정의 상으로는 불가능합니다. Java로 작성된 IntentService의 하위 클래스입니다 Service. 따라서, 아무것도이 IntentService수행하는이 Service코드의 해당 비트가 포함시킴으로써, 할 수있는 IntentService용도.

자체 스레드로 서비스를 시작하는 것은 IntentService를 시작하는 것과 같습니다. 그렇지 않습니까?

의 세 가지 주요 기능은 다음 IntentService과 같습니다.

  • 백그라운드 스레드

  • 의 자동 큐잉으로 Intent전달 onStartCommand()되므로 백그라운드 스레드에서 하나 Intent를 처리하는 onHandleIntent()경우 다른 명령은 차례를 대기합니다.

  • 대기열이 비면를 IntentService호출 하여을 자동으로 종료stopSelf()

Service확장없이 확장 하여 구현할 수 있습니다 IntentService.


답변

서비스

  • 에 의해 호출 startService()
  • 어느 곳에서나 트리거 Thread
  • 에 실행 Main Thread
  • 메인 (UI) 스레드를 차단할 수 있습니다. 긴 작업을 위해 항상 서비스 내에서 스레드 사용
  • 작업이 완료되면 전화 stopSelf()또는stopService()

IntentService

  • 통신이 다음 필요가 수행되는 경우는 보통 긴 작업을 메인 스레드와의 통신을 수행하지 않습니다 Handler또는BroadcastReceiver
  • 통해 호출 Intent
  • 에서 트리거 Main Thread
  • 별도의 스레드에서 실행
  • 작업을 병렬로 실행할 수 없으며 여러 작업자가 동일한 작업자 스레드에서 대기합니다.

답변

바퀴를 재발 명하지 마십시오

IntentService 는 의도적으로 동일한 목적 으로 만들어진 서비스 클래스를 확장 합니다.IntentService

그래서 목적은 무엇입니까?

`IntentService의 목적은 걱정없이 백그라운드 작업을보다 쉽게 ​​실행할 수 있도록하는 것입니다.

  • 작업자 스레드 생성

  • 다중 요청 처리를 하나씩 큐잉 ( Threading)

  • 파괴 Service

따라서 NOService할 수있는 모든 작업을 수행 IntentService할 수 있습니다. 요구 사항이 위에서 언급 한 기준에 해당되는 경우 해당 논리를 Service클래스 에 작성할 필요가 없습니다 . 발명 된 바퀴이기 때문에 바퀴를 재발 명하지 마십시오 IntentService.

“주요”차이

서비스는 UI 스레드에서 실행되는 반면 IntentService는 별도의 스레드에서 실행됩니다.

언제 IntentService를 사용합니까?

활동의 범위를 넘어 존재하는 여러 백그라운드 작업을 하나씩 수행하려면 IntentService완벽합니다.

어떻게 IntentService만들어 지는가Service

UI 스레드에서 정상적인 서비스가 실행 (기본 예에 의한 UI 스레드에서 모든 안드로이드 구성 요소 유형의 실행 Activity, BroadcastReceiver, ContentProviderService). 완료하는 데 시간이 걸릴 수있는 작업을 수행해야하는 경우 스레드를 작성해야합니다. 여러 요청의 경우을 처리해야 synchronization합니다.
IntentService이러한 작업을 수행하는 기본 구현이 제공됩니다. 개발자 페이지
에 따르면

  1. IntentService 작업자 스레드를 만듭니다.

  2. IntentServiceonHandleIntent()메소드에 하나씩 요청을 보내는 작업 큐를 작성합니다.

  3. 작업이 없으면 메소드 를 IntentService호출 stopSelf()합니다.
  4. onBind()null 인 메소드에 대한 기본 구현을 제공합니다.
  5. 의 기본 구현 onStartCommand()전송 Intent이 Workqueue에 결국에 요청onHandleIntent()

답변

허용 된 답변에 포인트 추가 :

Android API 내에서 IntentService 사용법을 참조하십시오. 예 :

public class SimpleWakefulService extends IntentService {
    public SimpleWakefulService() {
        super("SimpleWakefulService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {  ...}

앱의 IntentService 구성 요소를 만들려면 IntentService를 확장하는 클래스를 정의하고 그 안에 onHandleIntent ()를 재정의하는 메서드를 정의하십시오.

또한 IntentService의 소스 코드, onStartCommand와 같은 생성자 및 수명주기 메소드를 참조하십시오.

  @Override
    public int More ...onStartCommand(Intent intent, int flags, int startId) {
       onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

AsyncTask를 함께 서비스하는 것은 페이로드가 크지 않은 많은 사용 사례에 가장 적합한 방법 중 하나입니다. 또는 IntentSerivce를 확장하는 클래스를 작성하십시오. Android 버전 4.0부터 모든 네트워크 작업은 백그라운드 프로세스 여야합니다. 그렇지 않으면 응용 프로그램 컴파일 / 빌드가 실패합니다. UI에서 스레드를 분리하십시오. AsyncTask 클래스는 UI 스레드에서 새 작업을 시작하는 가장 간단한 방법 중 하나를 제공합니다. 이 주제에 대한 자세한 내용은 블로그 게시물을 참조하십시오.

에서 안드로이드 개발자 가이드 :

IntentService는 요청시 비동기 요청 (인 텐트로 표현)을 처리하는 서비스의 기본 클래스입니다. 클라이언트는 startService (Intent) 호출을 통해 요청을 보냅니다. 서비스는 필요에 따라 시작되고 작업자 스레드를 사용하여 각 의도를 처리하며 작업이 부족할 때 자체 중지됩니다.

IntentService에서 사용되는 디자인 패턴

:이 “작업 큐 프로세서”패턴은 일반적으로 응용 프로그램의 메인 스레드에서 작업을 오프로드하는 데 사용됩니다. IntentService 클래스는이 패턴을 단순화하고 역학을 관리하기 위해 존재합니다. 사용하려면 IntentService를 확장하고 onHandleIntent (Intent)를 구현하십시오. IntentService는 인 텐트를 수신하고 작업자 스레드를 시작한 다음 서비스를 적절하게 중지합니다.

모든 요청은 단일 작업자 스레드에서 처리됩니다. 필요한 경우 시간이 오래 걸리고 응용 프로그램의 기본 루프를 차단하지는 않지만 한 번에 하나의 요청 만 처리됩니다.

IntentService 클래스는 단일 백그라운드 스레드에서 작업을 실행하기위한 간단한 구조를 제공합니다. 이를 통해 사용자 인터페이스의 응답성에 영향을 미치지 않으면 서 장기 실행 작업을 처리 할 수 ​​있습니다. 또한 IntentService는 대부분의 사용자 인터페이스 수명주기 이벤트의 영향을받지 않으므로 AsyncTask가 종료되는 상황에서 계속 실행됩니다.

IntentService에는 몇 가지 제한 사항이 있습니다.

사용자 인터페이스와 직접 상호 작용할 수 없습니다. 결과를 UI에 넣으려면 액티비티로 보내야합니다. 작업 요청은 순차적으로 실행됩니다. 작업이 IntentService에서 실행 중이고 다른 요청을 보내면 첫 번째 작업이 완료 될 때까지 요청이 대기합니다. IntentService에서 실행중인 작업을 중단 할 수 없습니다. 그러나 대부분의 경우

IntentService는 간단한 백그라운드 작업에 선호되는 방법입니다.

**

발리 도서관

안드로이드 네트워킹 애플리케이션 개발을위한 volley- library라는 라이브러리
가 있습니다. 소스 코드는 GitHub에서 일반인에게 공개됩니다.

백그라운드 작업에 대한 모범 사례에 대한 Android 공식 문서 : 의도 서비스, 스레드, 핸들러, 서비스에 대한 이해를 돕습니다. 또한 네트워크 작업 수행


답변

‘Android IntentService vs Service’와 같은 것을 인터넷으로 검색하여 광범위한 차이점 목록을 찾을 수 있다고 확신합니다.

예제 당 가장 중요한 차이점 중 하나는 IntentService가 완료되면 자체 종료된다는 것입니다.

몇 가지 예 (빠른 구성)가있을 수 있습니다.

IntentService : 앱을 시작할 때 많은 이미지를 다운로드하려는 경우. 일회성 프로세스이며 모든 다운로드가 완료되면 스스로 정리할 수 있습니다.

서비스 : 웹 API 호출을 통해 앱과 백엔드 간 통신에 지속적으로 사용되는 서비스입니다. 현재 작업을 마치더라도 몇 분 후에 더 많은 의사 소통을하기를 원합니다.


답변

IntentService

IntentService자체 스레드에서 실행됩니다. 완료되면 스스로 중지됩니다. 불을 피우고 잊어 버리십시오. 후속 통화가 대기됩니다. 통화 대기에 좋습니다. IntentService필요한 경우 여러 스레드를 회전시킬 수도 있습니다 ThreadPoolExecutor. 나는 많은 사람들이 ” IntentService병렬 실행을 지원하지 않기 때문에 왜 사용 하는가”라고 물었 기 때문에 이것을 말합니다 .
IntentService그냥 스레드입니다. 당신은 그 안에 필요한 모든 것을 할 수 있습니다-심지어 여러 스레드를 회전시킵니다. 유일한주의 사항은 IntentService여러 스레드를 회전하자마자 완료 된다는 것 입니다. 스레드가 다시 올 때까지 기다리지 않습니다. 이 일을 처리해야합니다. 따라서 ThreadPoolExecutor이러한 시나리오에서 사용 하는 것이 좋습니다 .

  • 동기화, 업로드 등에 좋습니다…

서비스

기본적으로 Service기본 스레드에서 실행됩니다. 작업을 수행하려면 작업자 스레드를 회전시켜야합니다. service명시 적 으로 중지해야합니다 . 앱에서 멀어지고 헤드리스를 위해 더 많이 돌아올 때에도 백그라운드에서 물건을 실행 해야하는 상황에 사용했습니다 service.

  • 필요한 경우 여러 스레드를 다시 실행할 수 있습니다.
  • 음악 플레이어와 같은 앱에 사용할 수 있습니다.

BroadcastReceivers필요한 경우 언제든지 활동과 다시 대화 할 수 있습니다 .