2011-03-18 3 views
7

웹 서버에 대한 웹 서비스 호출을 대기중인 IntentService가 있습니다. 그래서 각 인 텐트는 웹 서비스 호출이다.큐에 대한 정보를 얻기 위해 IntentService 요청하기

내 IntentService에 특정 데이터 조각이 들어있는 Intent가있는 경우 응용 프로그램이 요청할 수있는 부분을 설정하고 싶습니다 (IE : "이미 x 데이터를 클라우드에 요청할 때 대기 중입니까? 너에게 해줄거야? ").

IntentService를 확장하는 방법에 대한 제안 사항이 있습니까? IntentService의 Intent 큐를 순회 할 수 있습니까? 아니면 IntentService 코드를 가져 와서 변경해야합니까?

내가 가지고있는 유일한 다른 생각은 데이터베이스에 테이블을 추가하고 어떤 호출이 대기열에 있으며 로그가 완료되면 테이블에서 제거됩니다.

답변

19

IntentService를 확장하는 방법에 대한 제안 사항이 있습니까? IntentService의 Intent 큐를 순회 할 수 있습니까? 아니면 IntentService 코드를 가져 와서 변경해야합니까?

아마도 실제 큐를 검사하고 싶다면 아마도 후자입니다. IntentServiceIntentsHandlerThread을 통해 Looper의 메시지 대기열에있는 메시지로 바꿉니다. SDK를 통해 노출 된 것은 없습니다. 다행히도 IntentService은 매우 짧습니다. 심지어 150 줄도 아닙니다. 패키지를 자신의 패키지에 복제하고 필요에 따라 수정할 수 있습니다. AOSP 저장소에 새로운 소스 업데이트가 릴리스되면 소스에 diff를 실행하면 Google이 IntentService에서 주요 수술을 수행했는지 알 수 있으므로 활용할 수도 있습니다.

다른 생각은 데이터베이스에 테이블을 추가하고 어떤 호출이 대기열에 있으며 로그가 완료되면 테이블에서 제거됩니다.

IntentService의 자체 대기열이 영구하지 않기 때문에 영구적 일 필요가 없습니다. onStartCommand()에 고유 한 FIFO 대기열을 유지하고 수퍼 클래스에 연결 한 다음 onHandleIntent() 끝의 대기열에서 Intent을 터뜨리기 만하면됩니다. 이렇게하면 마스터 대기열과의 동기화가 해제 될 수 있습니다 (예 : finally을 사용하여 대기열에서 작업을 해지하려는 경우).하지만 클론을 복제 할 필요는 없습니다.

+0

위대한 게시물에 대한 영감을 발견하는 부드러운 솔루션입니다. 나는 지금 탐구 할 좋은 아이디어가 있다고 생각한다. 고마워요 :) – Andrew

+1

이 게시물에 대해 정말 고마워. Intent가 이미 큐에 있으면 실행을 차단하기 위해이 클래스의 버전을 구현했지만 필요하면 쉽게 조정할 수 있습니다. https://gist.github.com/2898452 – SeanPONeil

+1

작업 코드를 보내 주셔서 감사합니다. 내가 만든 유일한 추가 사항은 filterEquals를 사용하는 기본 isEqual 메서드를 추가하는 것이 었습니다. 그러면 filterEquals가 재정의 할 수있게되어 모든 엑스트라를 인 텐트로 비교할 수있게되었습니다. 모든 내 의도에 대한 작업이 동일하기 때문입니다. 아 나는 또한 UniqueIntentService 나의 버전을 불렀다. :) – guyland123

1

또 다른 해결책은 onStartCommand를 재정 의하여 해결할 수 있습니다.

Here 내가 비슷한 문제 :

+0

그러나 내가 더 가까이에서 보았을 때 나는 그 질문을 게시했다는 것을 알고있다 :) – johan

관련 문제