一、FileDownLoader
關於FileDownLoader下載引擎可以看github,地址:FileDownLoader
二、使用樣例(AS工程)
1、AndroidManifest.xml裏聲明所需權限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
2、app的buil.gradle中添加依賴:
implementation 'com.liulishuo.filedownloader:library:1.7.7'
3、 在Application的onCreate函數裏進行FileDownLoader的初始化:
/**
* @author: cwang
* @time: 2019/12/1618:03
* @Description:
*/
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// FileDownloader初始化
FileDownloader.setupOnApplicationOnCreate(this);
}
}
4、FileDownloadUtils工具類
package com.cwang.utils;
import android.util.Log;
import com.liulishuo.filedownloader.BaseDownloadTask;
import com.liulishuo.filedownloader.FileDownloadListener;
import com.liulishuo.filedownloader.FileDownloader;
/**
* @author: cwang
* @time: 2019/12/1616:53
* @Description:文件下載,支持斷點續傳
*/
public class FileDownloadUtils {
private final String TAG = FileDownloadUtils.class.getName();
public static FileDownloadUtils instance = null;
public FileDownloadUtils() {
}
public static FileDownloadUtils getInstance() {
if (null == instance) {
instance = new FileDownloadUtils();
}
return instance;
}
/**
* 單任務下載
*
* @param downLoadUri 文件下載網絡地址
* @param destinationUri 下載文件的存儲絕對路徑
*/
public void startDownLoadFileSingle(String downLoadUri, String destinationUri, FileDownLoaderCallBack callBack) {
FileDownloader.getImpl().create(downLoadUri).setPath(destinationUri).setListener(fileDownloadListener(callBack)).start();
}
// 下載方法
private FileDownloadListener fileDownloadListener(final FileDownLoaderCallBack callBack) {
return new FileDownloadListener() {
@Override
protected void pending(BaseDownloadTask task, int soFarBytes, int totalBytes) {
Log.i(TAG, "DownloadTask pending 等待,已經進入下載隊列");
//等待,已經進入下載隊列
}
@Override
protected void progress(BaseDownloadTask task, int soFarBytes, int totalBytes) {
//下載進度回調
if (callBack != null) {
callBack.downLoadProgress(task, soFarBytes, totalBytes);
}
}
@Override
protected void completed(BaseDownloadTask task) {
Log.i(TAG, "DownloadTask completed 完成整個下載過程");
//完成整個下載過程
if (callBack != null) {
callBack.downLoadCompleted(task);
}
}
@Override
protected void paused(BaseDownloadTask task, int soFarBytes, int totalBytes) {
//暫停下載
Log.i(TAG, "DownloadTask paused 暫停下載");
}
@Override
protected void error(BaseDownloadTask task, Throwable e) {
// Log.e(TAG, "DownloadTask error");
//下載出現錯誤
if (callBack != null) {
callBack.downLoadError(task, e);
}
}
@Override
protected void warn(BaseDownloadTask task) {
Log.i(TAG, "DownloadTask warn 在下載隊列中(正在等待/正在下載)已經存在相同下載連接與相同存儲路徑的任務");
//在下載隊列中(正在等待/正在下載)已經存在相同下載連接與相同存儲路徑的任務
}
};
}
public interface FileDownLoaderCallBack {
//文件是否下載完成
void downLoadCompleted(BaseDownloadTask task);
//文件是否下載失敗
void downLoadError(BaseDownloadTask task, Throwable e);
//文件下載進度
void downLoadProgress(BaseDownloadTask task, int soFarBytes, int totalBytes);
}
}
5、調用文件下載函數:
final String Tag = ”FileDownloadUtilsTag”;
final String loadUrl = ”https://www.xxxx.com/file/....“; // 下載文件的服務器地址
final String filePath = ”/sdcard/myFile.txt“; // 本地存儲下載文件的絕對地址
FileDownloadUtils.getInstance().startDownLoadFileSingle(loadUrl, filePath, new FileDownloadUtils.FileDownLoaderCallBack() {
@Override
public void downLoadCompleted(BaseDownloadTask task) {
// 下載完成
Log.i(Tag, "DownloadTask downLoadCompleted");
}
@Override
public void downLoadError(BaseDownloadTask task, Throwable e) {
// 下載出現錯誤
Log.e(Tag, "loadNewAPK onError:" + e.getMessage());
}
@Override
public void downLoadProgress(BaseDownloadTask task, int soFarBytes, int totalBytes) {
// 下載進度
Log.i(Tag, "DownloadTask downLoadProgress: " + soFarBytes + " / " + totalBytes);
}
});