2013-10-17 4 views
1

서비스에서 실행 된 AsyncTask이 있습니다. 별도의 스레드에서 AsyncTask 실행 이후, 나는 몇 가지 의심이 :서비스에서 실행 된 AsyncTask

  1. AsyncTask를하면서 서비스 onStartCommand() 메소드가 리턴 실행하면 어떻게 될까? AsyncTask이 실행되는 동안 서비스가 종료 되었습니까? 이 상황을 가장 효과적으로 해결하려면 START_STICKY을 사용해야하나요?

  2. onPostExecute()은 UIThread에서 실행되므로 서비스의 onStartCommand 메서드와 동일한 스레드에서 실행됩니까? 위의 경우 서비스가 종료되는 동안 AsyncTask이 계속 실행중인 경우 어떻게됩니까? 어느 스레드가 onPostExecute()일까요? 서비스는 방송 수신기의 onReceive 방법에서 인스턴스화되기 때문에

    Update:

    내가 서비스를 사용하고 그 이유

이다. 나는 onReceive에서 일반적인 스레드를 사용할 수 있지만 Service-AsyncTask 패턴을 사용하는 것이 더 좋다고 생각한다. 왜냐하면 나는 어떤 알림을 발동해야하기 때문에 onPreExecuteonPostExecute에서 수행하고있다.

답변

3

나는 서비스

이 거의 Service의 기본 응용 프로그램 스레드에서 작업을 할 필요가 없기 때문에에서 실행되는 AsyncTask를이, 난 그냥 보통의 스레드를 사용하는 것이 좋습니다 것입니다.

AsyncTask가 실행되는 동안 service onStartCommand() 메서드가 반환되면 어떻게됩니까?

없음.

AsyncTask가 실행되는 동안 서비스가 종료됩니까?

onStartCommand() 서비스가 명령을 보낼 때 호출됩니다. 서비스가 종료 될 때 호출되지 않습니다.

사용해야합니까? START_STICKY?

초록에서는 대답 할 수 없습니다. 서비스를 나중에 다시 시작해야하는 경우에 사용하십시오 (예 : 사용 가능한 메모리가 개선되는 경우).

onPostExecute()는 UIThread에서 실행되므로 서비스와 동일한 스레드에서 실행됩니까?

개체가 Java의 스레드에서 실행되지 않습니다. 따라서 서비스는 스레드에서 실행되지 않습니다. 메서드는 스레드에서 실행됩니다.

위의 경우 서비스가 종료되는 동안 AsyncTask가 실행중인 경우에는 어떻게됩니까?

서비스를 종료하는 사람은 귀하뿐입니다.

OS가 다른 이유로 서비스를 제거하는 경우 전체 프로세스를 종료하여 OS를 종료하는 경향이 있습니다.이 경우 AsyncTask도 사라집니다.

어떤 스레드가 onPostExeucte()에 적용됩니까?

onPostExecute()은 기본 응용 프로그램 스레드에서 실행됩니다. Service에서 이것이 거의 필요하지 않거나 좋은 아이디어이기 때문에 AsyncTask이 아닌 일반 스레드를 사용해보십시오.

IntentService은 고유 한 백그라운드 스레드가 포함되어 있으므로 작업이 본질적으로 트랜잭션 인 경우 (예 : 몇 초 동안 실행해야하고 작업이 완료되고 서비스가 더 이상 필요하지 않은 경우) IntentService을 사용하십시오. , 그래서 당신은 당신이 필요하지 않습니다. 서비스 아무것도와는 아무 상관이없는 방송 수신기

의 onReceive 메서드에서 인스턴스화되기 때문에

UPDATE

내가 서비스를 사용하고있는 이유입니다.

내가 onPreExecute 및 onPostExecute에서 수행중인 알림도 실행해야합니다.

Notification은 백그라운드 스레드에서 발생시킬 수 있습니다. 기본 응용 프로그램 스레드에서 수행 할 필요가 없습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 내 질문을 업데이트했다. –

+0

@MadhurAhuja : 답변을 업데이트했습니다. – CommonsWare

관련 문제