2011-11-03 3 views
1

다운로드 할 파일 배열을로드하는 중이고 해당 파일 각각에 대해 IntentService가 시작됩니다. 문제는 인터넷 연결 문제인데, 예를 들어 장치가 연결이 끊어진 경우 IntentService의 대기열 처리를 어떻게 든 지우거나 중지해야합니다.인터넷이 다운되면 IntentService 대기열을 중지/지우시겠습니까?

내 코드에는 파일을 다운로드하는 while 루프가 있습니다. 실행이 루프의 조건 중 하나는 :

while(.. , isOnline()){ 
    /// Download file 
} 

난 경우

public boolean isOnline() { 
     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     if(cm != null){ 
      return cm.getActiveNetworkInfo().isConnectedOrConnecting(); 
     } 
     return false; 


} 

내 루프는 다음과 비슷한입니다 : 나는 다음과 같은 코드를 사용하여 수행 한 인터넷 연결 확인 이제 대기열에 파일을 다운로드하고 인터넷이 다운되면 루프가 더 이상 실행되지 않고 해당 파일에 대한 IntentService가 중지되지만 이제 인터넷이 다시 돌아 오면 마지막 파일을 무시하고 대기열의 다음 파일에서 다운로드가 시작됩니다. 우리는 다운로드 할 수 없었다. IntentService 대기열을 지우거나 IntentService 대기열이 남은 곳에서 다운로드를 다시 시작하도록하려면 어떻게해야합니까?

답변

1

IntentService 큐를 지우거나 IntentService 큐를 왼쪽에서 다운로드를 다시 시작하려면 어떻게해야합니까?

AFAIK는 실제로 할 수 없습니다. IntentService에 의해 사용 된 큐는 개발자에게 노출되지 않습니다. 이 경우

, 당신은 더 나은 수 있습니다 자신의 큐를 작성 역임 (예를 들어, LinkedBlockingQueue)을, 그 큐를 모니터링 자신의 스레드, 그리고 자신의 Service 포장까지이 모든 (그리고 사건을 처리하는 경우, 큐 비면 번 stopSelf()으로 전화하고 백그라운드 스레드를 종료하십시오.

또는 IntentService이 실패한 다운로드에 대해 (예 : Messenger을 통해) 알리도록하십시오. 그러면 인터넷 액세스가 반환 된 후에 언젠가 그 파일을 대기열에 추가 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 내가 어디서나 찾을 수없는 것처럼 안드로이드 플랫폼에서 IntentService의 구현에 대한 참조 링크를 주시겠습니까 !!!! – bytebiscuit

+0

http://www.google.com/codesearch#cZwlSNS7aEw/frameworks/base/core/java/android/app/IntentService.java – CommonsWare

+0

여기에서 고민하는 중입니다.이 LinkedBlockQueue에는 스레드가 포함되며이 대기열은 '최고'스레드는이 모든 것을 서비스 클래스 내부에서 말한 것처럼 포장했습니다. 그래서 지금 내가 10 개의 파일을 가지고 있다면 나는이 큐에 저장된 10 개의 쓰레드를 시작하고 순차적으로 실행되는 최고의 쓰레드로 제어 할 필요가있다. 스레드가 인터넷이 다운되었음을 감지하면 최상위 스레드는이를 알게되고 최상위 스레드는 SharedPreferences를 사용하여 다운로드 한 파일의 기록을 유지하고 자체를 종료하고 대기열을 지 웁니다. – bytebiscuit

관련 문제