记录下常用的一个下载集成工具类
这里采用的是okhttp3,记得在build.gradle中添加依赖
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
下面是核心代码
public class DownloadUtil {
public static final int DOWNLOAD_FAIL = 0;
public static final int DOWNLOAD_PROGRESS = 1;
public static final int DOWNLOAD_SUCCESS = 2;
private static DownloadUtil downloadUtil;
private final OkHttpClient okHttpClient;
public static DownloadUtil getInstance() {
if (downloadUtil == null) {
downloadUtil = new DownloadUtil();
}
return downloadUtil;
}
private DownloadUtil() {
okHttpClient = new OkHttpClient();
}
/**
* 下载
*
* @param url 下载链接
* @param saveDir 文件保存目录
* @param listener 下载监听事件
*/
public void download(String url, String saveDir, String child, OnDownloadListener listener) {
this.listener = listener;
Request request = new Request.Builder().url(url).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
Message message = Message.obtain();
message.what = DOWNLOAD_FAIL;
mHandler.sendMessage(message);
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
InputStream is = null;
byte[] buf = new byte[2048];
int len;
FileOutputStream fos = null;
//储存下载文件的目录
String savePath = isExistDir(saveDir);
try {
is = response.body().byteStream();
long total = response.body().contentLength();
File file = new File(savePath, child);
fos = new FileOutputStream(file);
long sum = 0;
while ((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
sum += len;
int progress = (int) (sum * 1.0f / total * 100);
//下载中
Message message = Message.obtain();
message.what = DOWNLOAD_PROGRESS;
message.obj = progress;
mHandler.sendMessage(message);
}
fos.flush();
//下载完成
Message message = Message.obtain();
message.what = DOWNLOAD_SUCCESS;
message.obj = file.getAbsolutePath();
mHandler.sendMessage(message);
} catch (Exception e) {
Message message = Message.obtain();
message.what = DOWNLOAD_FAIL;
mHandler.sendMessage(message);
} finally {
try {
if (is != null)
is.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
}
@NonNull
private String getNameFromUrl(@NonNull String url) {
return url.substring(url.lastIndexOf("/") + 1);
}
@NonNull
private String isExistDir(String saveDir) throws IOException {
final File dir = new File(saveDir);
if (!dir.exists()) {
if (!dir.mkdirs()) {
throw new IOException("mkdir error:" + saveDir);
}
}
return dir.getAbsolutePath();
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case DOWNLOAD_PROGRESS:
listener.onDownloading((Integer) msg.obj);
break;
case DOWNLOAD_FAIL:
listener.onDownloadFailed();
break;
case DOWNLOAD_SUCCESS:
listener.onDownloadSuccess((String) msg.obj);
break;
}
}
};
OnDownloadListener listener;
public interface OnDownloadListener {
/**
* 下载成功
*/
void onDownloadSuccess(String path);
/**
* 下载进度
*
* @param progress 进度
*/
void onDownloading(int progress);
/**
* 下载失败
*/
void onDownloadFailed();
}
}
日常记录分享,谢谢支持!