package com.sinata.download.http;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import com.sinata.download.utils.Logger;
|
|
import java.io.File;
|
import java.io.FileOutputStream;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.util.concurrent.TimeUnit;
|
|
import okhttp3.Call;
|
import okhttp3.Callback;
|
import okhttp3.OkHttpClient;
|
import okhttp3.Request;
|
import okhttp3.Response;
|
import okhttp3.ResponseBody;
|
|
/**
|
* author:Created by zhaohaoting on 2019/6/25
|
* email:526309416@qq.com
|
* desc:
|
*/
|
public class DownLoadManager {
|
|
private static OkHttpClient downLoadHttpClient;
|
|
static {
|
OkHttpClient.Builder downLoadHttpClientBuilder = new OkHttpClient.Builder();
|
downLoadHttpClient = downLoadHttpClientBuilder.connectTimeout(3, TimeUnit.MINUTES)
|
.readTimeout(3, TimeUnit.MINUTES).writeTimeout(3, TimeUnit.MINUTES).build();
|
}
|
|
/**
|
* 下载文件
|
*
|
* @param url
|
* @param filePath
|
* @param listener
|
*/
|
public static void downLoadFile(String url, final String filePath, final DownloadListener listener) {
|
downLoadHttpClient.newCall(new Request.Builder().url(url).get().build()).enqueue(new Callback() {
|
@Override
|
public void onFailure(@NonNull Call call, @NonNull IOException e) {
|
listener.onFail(e.getMessage());
|
}
|
|
@Override
|
public void onResponse(@NonNull Call call, @NonNull Response response) {
|
ResponseBody responseBody = response.body();
|
if (responseBody == null) return;
|
InputStream is = null;
|
long currentLen = 0;
|
byte[] buf = new byte[1024];
|
int len = 0;
|
FileOutputStream fos = null;
|
try {
|
is = responseBody.byteStream();
|
File file = new File(filePath);
|
long length = responseBody.contentLength();
|
Logger.e("文件大小------------->", String.valueOf(length));
|
File parentFile = file.getParentFile();
|
if (!parentFile.exists()) {
|
boolean mkdirs = parentFile.mkdirs();
|
}
|
if (!file.exists()) {
|
boolean newFile = file.createNewFile();
|
} else {
|
if (file.length() == length) {//若本地存在当前下载文件,且文件大小一致(说明是同一个文件)则,无需再向磁盘写入
|
if (is != null) is.close();
|
listener.onProgress(100);
|
listener.onFinishDownload(true);
|
Logger.e("本地已有该文件------------->", "");
|
return;
|
}
|
}
|
listener.onStartDownload();
|
fos = new FileOutputStream(file);
|
while ((len = is.read(buf)) != -1) {
|
fos.write(buf, 0, len);
|
currentLen += len;
|
int progress = (int) (currentLen * 100 / length);
|
Logger.e("下载中------------->", String.valueOf(progress));
|
listener.onProgress(progress);
|
}
|
fos.flush();
|
//如果下载文件成功,第一个参数为文件的绝对路径
|
listener.onFinishDownload(false);
|
} catch (Exception e) {
|
listener.onFail(e.getMessage());
|
} finally {
|
try {
|
if (is != null) is.close();
|
} catch (Exception e) {
|
}
|
try {
|
if (fos != null) fos.close();
|
} catch (Exception e) {
|
}
|
}
|
}
|
});
|
}
|
}
|