从服务器下载指定文件的标准方法

本文介绍了一个用于Android平台的文件下载工具类FileDownloadTask的实现细节。该工具利用OkGo库进行网络请求,支持下载进度监听及错误处理等功能。

FileDownloadTask工具类:

import android.util.Log;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.FileCallback;
import com.lzy.okgo.request.GetRequest;
import java.io.File;
import okhttp3.Call;
import okhttp3.Response;

public class FileDownloadTask {
    private static final String TAG = FileDownloadTask.class.getSimpleName();
    private static final boolean IS_DEBUG = true;

    private OnProgressCallback mCallback = null;
    private String mUrl, mFilePath, mFileName;
    private GetRequest mFileDownloadRequest = null;
    private static FileDownloadTask instance = null;

    /**
     * downloadSource: 要下载的文件路径
     * localPath:     下载文件存放的本地路径
     * fileName:      下载后文件保存名称
     * callback:      下载完成后的回调
     */
    private FileDownloadTask(String downloadSource, String localPath, String fileName, OnProgressCallback callback) {
        mCallback = callback;
        mUrl = downloadSource;
        mFilePath = localPath;
        mFileName = fileName;
    }

    public static FileDownloadTask getInstance(String downloadSource, String localPath, String fileName, OnProgressCallback callback) {
        instance = new FileDownloadTask(downloadSource, localPath, fileName, callback);
        return instance;
    }

    public void download() {
        if (null == mUrl && "".equals(mUrl)) {
            mCallback.onError(null, null, new Exception("Illegal url"));
            return;
        }
        if (IS_DEBUG)
            Log.d(TAG, "---start download--- " + (null == mFileDownloadRequest));
        if (null == mFileDownloadRequest) {
            mFileDownloadRequest = OkGo.get(mUrl).tag(mUrl);
            mFileDownloadRequest.execute(new DownLoadFileCallback(mFilePath, mFileName));
        } else {
            mFileDownloadRequest.setCallback(new DownLoadFileCallback(mFilePath, mFileName));
        }
    }

    public void setOnProgressCallback(OnProgressCallback callback) {
        this.mCallback = callback;
    }

    private class DownLoadFileCallback extends FileCallback {

        public DownLoadFileCallback(String destFileDir, String destFileName) {
            super(destFileDir, destFileName);
        }

        @Override
        public void downloadProgress(long currentSize, long totalSize,
                                     float progress, long networkSpeed) {
            if (null != mCallback) {
                mCallback.onProgressUpdate(currentSize, totalSize, progress, networkSpeed);
            }
            if (IS_DEBUG)
                Log.d(TAG, "---downloadProgress update::" + progress);
        }

        @Override
        public void onError(Call call, Response response, Exception e) {
            // TODO Auto-generated method stub
            if (null != mCallback) {
                mCallback.onError(call, response, e);
            }
            if (IS_DEBUG)
                Log.d(TAG, "---onError::download failed!");
            mFileDownloadRequest = null;
            super.onError(call, response, e);
        }

        public void onSuccess(File file, Call call, Response response) {
            if (IS_DEBUG) {
                Log.d(TAG, "---onSuccess---");
            }
            if (null != mCallback) {
                mCallback.onCompleted(file, call, response);
            }
            mFileDownloadRequest = null;
        }
    }

    public void stopDownloadTask() {
        //Activity销毁时,取消网络请求
        OkGo.getInstance().cancelTag(mUrl);
    }

    public void release() {
        try {
            if ((Runtime.getRuntime().exec("rm -r " + mFilePath + "/" + mFileName + "\n").waitFor()) == 0) {
                if (IS_DEBUG)
                    Log.i(TAG, TAG + "FilePath = " + mFilePath + " Release resources!");
            } else {
                Log.e(TAG, TAG + "FilePath = " + mFilePath + " Cant delete the download cache!");
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e(TAG, TAG + "FilePath = " + mFilePath + "Cant delete the download cache!");
        }
    }

    public void release(String filePath, String fileName) {
        try {
            if ((Runtime.getRuntime().exec("rm -r " + filePath + "/" + fileName + "\n").waitFor()) == 0) {
                if (IS_DEBUG)
                    Log.i(TAG, TAG + "filePath = " + filePath + " Release resources!");
            } else {
                Log.e(TAG, TAG + "filePath = " + filePath + " Cant delete the download cache!");
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e(TAG, TAG + "filePath = " + filePath + "Cant delete the download cache!");
        }
    }

    public interface OnProgressCallback {
        public void onProgressUpdate(long currentSize, long totalSize, float progress, long networkSpeed);

        public void onError(Call call, Response response, Exception e);

        public void onCompleted(File file, Call call, Response response);
    }
}

//使用方法:

    private void downloadFile() {
        String url = FILE_URL;  //要被下载的文件路径;

        final FileDownloadTask downloadTask = FileDownloadTask.getInstance(url, getFilesDir().getAbsolutePath(), "picons.zip", null);

        downloadTask.setOnProgressCallback(new OnProgressCallback() {

            @Override
            public void onProgressUpdate(long currentSize, long totalSize, float progress, long networkSpeed) {
                DLog.d("progress = " + progress);
            }

            @Override
            public void onError(Call call, Response response, Exception e) {
                //下载发生了错误
                if (checkIconZipFileExists()) {
                    downloadTask.release(getFilesDir().getAbsolutePath(), "picons.zip");
                }
            }

            @Override
            public void onCompleted(File filr, Call call, Response response) {
                //下载完成
            }
        });

        downloadTask.download();
    }

    需要下面的3个jar,放到app/libs下,在app的build.gradle引入进来。

    compile files('libs/okgo-2.1.4.jar')

    compile files('libs/okhttp-3.4.1.jar')

    compile files('libs/okio-1.9.0.jar')

    这3个jar可以自己去网上下载,也可以在如下的地址下载:

    https://download.youkuaiyun.com/download/wujiang_android/10302765


                                                      THE END

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值