15

나는 사용 사례가 있습니다.안드로이드 다운로드 관리자가 다운로드 참조 ID로 다운로드 상태를 제공 할 때까지?

나는 안드로이드 다운로드 관리자를 사용하여 파일을 다운로드하기 시작했고, 중간에서 휴대 전화를 사용하지 않았습니다. 다시 시작하면 다운로드가 계속되고 완료됩니다. 다운로드 참조 ID를 부여하여 상태를 얻었습니다. 하지만 그 참조 ID를 사용하여 10 일 후에도 상태를 알고 싶습니다.

내 질문은 안드로이드 다운로드 관리자가 다운로드 참조 ID로 다운로드 상태를 알려줄 때까지입니다.

문서를 조사한 결과 스택 오버 플로우가 발생했지만 답변을 찾을 수 없습니다. 누군가 나를 도와주세요.

+0

나는 동일한 질문을하고 있습니다 ... 내 생각 엔 사용자가 다운로드 관리자 앱에서 다운로드를 제거하지 않은 상태에서 데이터를 사용할 수 있다는 것입니다 (길게 누르면 삭제됨). – daramasala

답변

1

안드로이드 DownloaderManager를 사용하는 경우

SharedPreferences settings = getSharedPreferences("DownloadIDS", 0); 
SharedPreferences.Editor editor = settings.edit(); 
editor.putLong("downloadIds", downloadID); 
editor.commit(); 

당신은 ID 나중에 검색 할 수는 시스템 서비스입니다. 항상 실행되고 있어야합니다. 그러나 실행할 수없는 경우가 있습니다.

다운로드는 HTTP 영구 연결을 통해 이루어집니다. 연속 된 HTTP 요청/응답에 동일한 연결이 사용됨을 의미합니다. 연결 끊기 오류가 발생하여 참조 ID별로 상태를 추적 할 수 없습니다.

너는 안드로이드 DownloadManager 서비스가 서버에서 STATUS 코드를 얻는 곳에 DownloadManager 서비스를 통해 추적한다.

Android DownloadManager는 content-length 기반 서버에서 다운로드를 사용합니다. Content-Length 헤더는 스트리밍을 허용하지 않습니다 (link). 콘텐츠 길이 기반 다운로드에는 이력서, 일시 중지, 부분 다운로드의 장점이 있습니다 (위의 link1 참조). 따라서 시스템을 다시 부팅 할 때도 다시 다운로드를 다시 시작합니다 (증가시킵니다).

content-length 기반 다운로드는 store and forward (link)입니다. 고정 버퍼가 제한되어 있으므로 버퍼링 된 내용을 영구 저장소로 전달해야합니다.

안드로이드 DownloadManager에는 ERROR_CANNOT_RESUME int 플래그 (link)가 있습니다. ERROR_CANNOT_RESUMECOLUMN_STATUS 플래그를 기반으로합니다. COLUMN STATUS에는 두 가지 유형이 있습니다. STATUS_PAUSED 또는 STATUS_FAILED입니다. 시스템이 꺼지기 전에 시스템은 BroadcastReceiver을 통해 안드로이드 DownloadManager 서비스를 종료합니다. Android DownloadManagerSTATUS_PAUSED 플래그를 활성화합니다. 다음에 장치를 다시 시작하면 시스템 서비스가 자동으로 실행되고 STATUS_PAUSED가 다시 다운로드를 시작하는지 확인합니다.

답 : 거기 (클라이언트 측, 연결 또는 서버 측에서) 오류가 발생하거나 파일을 (이 STATUS_SUCCESSFUL 때까지 의미) 다운로드 완료되지 지금까지, 당신은 안드로이드 DownloadManager에서 상태를 점점 계속. STATUS_FAILED이 발생하면 상태를 알 수 없습니다. 다운로드가 재 시도되지 않는다고 말합니다 (link).

STATUS_FAILED은 어떻게 발생합니까? 고객의 DownloadManager 서비스는 HTTP 상태 코드 4XX ( 클라이언트가 오류를 범됩니다 추측 서버) 및 5XX (서버 서버가 오류를 범됩니다 감지) (link), 지금 STATUS_FAILED는 참이를 감지합니다.

어떤 다른 상황 : 때 클라이언트 유지 꺼진 및 서버 논리에 따라, 서버가 시간 초과와의 연결을 종료 할 수 있습니다. 따라서이 컨트롤은 명시 적으로 다른 HTTP 서버를 기반으로합니다. 우리는 여기서 여러 날을 물을 수 없습니다. 우리는 서버 측 로직을 모른다. status_codes는 서버를 기반으로합니다. 서버가 클라이언트가 실패했다고 결정하면 서버는 timeout 연결을 사용하여 서버 측에서 STATUS_FAILED을 활성화합니다. 클라이언트는 TCP 연결이 임의의 시간에 사라 지도록 준비해야하며 연결을 다시 설정하고 HTTP 요청을 다시 시도 할 수 있어야합니다. 조기에 닫힌 연결은 오류로 처리되어서는 안됩니다. 연결을 재설정하려는 시도가 실패 할 경우에만 오류가 표시됩니다. 질문에 정확한 답변이 없습니다.

: TCP connections to disappear at arbitrary times (link)는 해제 장치의 특정 기간 (일) 후 연결을 다시 시작할 수 있습니다 여기에 주요 논리이다.

1) STATUS_FAILED에서 추가 데이터를 계속 추적 할 수 없습니다. 만약 COLUMN_STATUS

2)도 STATUS_FAILEDSTATUS_PAUSED이며,이 칼럼의 값이 정의되지, 여기에 추가로 데이터를 추적 할 수 없습니다.

- 위의 두 가지 조건 이외의 경우 다운로드가 진행 중입니다.

+0

@Gautam 답변을 주셔서 감사합니다. 답변을 완전히받지 못했습니다. 내 질문은, 내가 다운로드를 시작하고 레퍼런스 ID를 다운로드했다는 것을 고려하면, 상태는 STATUS_FAILED, STATUS_PAUSED, STATUS_SUCCESSFUL 등이 될 수 있습니다. 이제 몇 일 또는 몇 달이 지나면 안드로이드 시스템은 주어진 다운로드 참조 ID에 대한 상태를 제공합니까? –

+0

@San, 사과드립니다, 지금 이해했습니다. 이 id는 각 다운로드가 발생할 때마다 계속 무시됩니다. 상태가 성공적으로 완료되면 이제 전체 프로세스가 시스템의 기반이되는 GC 가비지 콜렉션의 일부가됩니다. –

+0

연결이 끊어지면 같은 현상이 발생합니다.연결이 실패하면 (나는 조기 실패 - 다시 대답을 읽지 않는다), 영원히 실패한다는 것을 의미합니다. 동일한 연결을 다시 설정할 수 없습니다. 자, 다시 전체 힙 연산은 GC에 의해 처리됩니다. –

-2

SharedPreferences를 사용하여 다운로드 참조 ID를 저장할 수 있습니다. 이 같은 뭔가 -이

SharedPreferences downloadids = context.getSharedPreferences("DownloadIDS", 0); 
long savedDownloadIds = downloadids.getLong("downloadIds", 0); 
+0

답변 해 주셔서 감사합니다. 여기에 내 질문에 대한 다운로드 참조 ID를 저장하지 않습니다 내 질문에 대해서는 안드로이드 시스템 주어진 다운로드 참조 ID에 대한 상태를 줄 때까지입니까? –

+1

'내 질문은 안드로이드 다운로드 관리자가 다운로드 ID로 다운로드 상태를 알려줄 때까지입니까?'라는 질문에 집중하십시오. –

+0

나는 그 질문을 이해합니다. 하지만 나는 OP의 문제를 다른 방식으로 해결하는 해결 방법을 제시하고 있습니다. 나는 downvotes 장점이 있다고 생각하지 않습니다. –