Android使用FileDownLoader實現文件下載——支持斷點續傳

一、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);
            }
        });

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章