2017-04-11 23 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は、コードの多くを試み、最終的に、私はBufferedSource源= responseBody.sourceで解決

最初の方法()。 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); 
} 

それが正常に働いていました。私は

SECOND WAY

私はスキップダウンロードされたバイトのヘッダを追加し、それが働いた:)ラッキーだと思います。

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); 
} 
関連する問題