2017-04-11 10 views
4

Android 용 다운로드 파일의 경우 okhttp 라이브러리를 사용합니다. 나는 성공적으로 다운로드한다. 그러나 다운로드를 일시 중지하고 다시 시작할 때 잘못된 것이 있습니다.Android에서 okhttp로 다운로드를 일시 중지/다시 시작하는 방법

Response request = new Request.Builder().url(url).build(); 
ResponseBody responseBody = response.body(); 

File file = new File(filePath); 
BufferedInputStream input = new BufferedInputStream(responseBody.byteStream()); 
OutputStream output; 

if (isResume) { 
    output = new FileOutputStream(file, true); 
    input.skip(downloadedSize); 
} else { 
    output = new FileOutputStream(file, false);  
} 

long totalByteSize = responseBody.contentLength(); 
byte[] data = new byte[1024]; 
int count = 0; 

while ((count = input.read(data)) != -1) { 
    downloadedSize += count; 
    output.write(data, 0, count); 
} 

문제는 예를 들어 파일 크기가 10MB라는 것입니다. 3MB를 다운로드 한 후 일시 중지하고 다운로드를 재개하고 다운로드가 완료되면 파일 크기가 13MB가됩니다. 그것은 이력서에 다운로드 한 크기에서 시작하지 않는다, 그것은 bytestream의 시작에서 다운로드를 시작한다. 파일은 13MB가됩니다. 코드에 어떤 문제가 있습니까?

+1

새 요청을 작성하여 보냈습니다. 그러면 응답이 전체 파일을 보유하게됩니다. okHttp에 부분 응답을 다운로드 할 수있는 기능이 있는지 확실하지 않지만 그렇게 할 경우 사용자가 수행하는 방식이 아닙니다. 최소한 다운로드를 시작할 위치에 대한 데이터를 전달해야합니다. –

답변

11

I 코드가 많이 시도하고 마지막 I은 BufferedSource 소스 = responseBody.source 해결할

FIRST WAY(); source.skip (downloadedSize);

Response request = new Request.Builder().url(url).build(); 
ResponseBody responseBody = response.body(); 
BufferedSource source = responseBody.source(); 

if(isResume) 
    source.skip(downloadedSize); 

File file = new File(filePath); 
BufferedInputStream input = new BufferedInputStream(responseBody.byteStream()); 
OutputStream output; 

if (isResume) { 
    output = new FileOutputStream(file, true); 
} else { 
    output = new FileOutputStream(file, false);  
} 

long currentDownloadedSize = 0; 
long currentTotalByteSize = responseBody.contentLength(); 
byte[] data = new byte[1024]; 
int count = 0; 
while ((count = input.read(data)) != -1) { 
    currentDownloadedSize += count; 
    output.write(data, 0, count); 
} 

정상적으로 작동했습니다. 나는

두 번째 방법

내가 스킵 다운로드 바이트 헤더를 추가하고 일 : 운이 좋은 것 같아요.

Request.Builder requestBuilder = new Request.Builder(); 
if (isResume) { 
    requestBuilder.addHeader("Range", "bytes=" + String.valueOf(downloadedSize) + "-"); 
} 
Response request = requestBuilder.url(url).build(); 
ResponseBody responseBody = response.body(); 
BufferedSource source = responseBody.source(); 

File file = new File(filePath); 
BufferedInputStream input = new BufferedInputStream(responseBody.byteStream()); 
OutputStream output; 

if (isResume) { 
    output = new FileOutputStream(file, true); 
} else { 
    output = new FileOutputStream(file, false);  
} 

long currentDownloadedSize = 0; 
long currentTotalByteSize = responseBody.contentLength(); 
byte[] data = new byte[1024]; 
int count = 0; 
while ((count = input.read(data)) != -1) { 
    currentDownloadedSize += count; 
    output.write(data, 0, count); 
}