美文网首页
Android retrofit2 大文件下载

Android retrofit2 大文件下载

作者: yunhen | 来源:发表于2018-12-21 17:15 被阅读61次

1.接口YunjiaService中

/**
     * 下载文件用
     * @param fileUrl
     * @return
     */
    @Streaming //添加这个注解用来下载大文件
    @GET()
    Call<ResponseBody> downloadFileUrl(@Url String fileUrl);

2.调用

mYunjiaService = retrofit.create(YunjiaService.class);

public void downFile(String url, Callback<ResponseBody> callback) {
        try {
            if (mYunjiaService == null) {
                init();
            }
            mYunjiaService.downloadFileUrl(url).enqueue(callback);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3.下载监听

public interface DownloadApkListener {
    void onStart();
    void onProgress(int p);
    void onFinish(String path);
    void onError(String msg);
}

4.下载到sd卡相关

 /**
     * 下载apk
     * @param downloadApkListener 下载回调
     */
    public void downApkFile(final DownloadApkListener downloadApkListener) {
       YunjiaServiceImp.getInstance().downFile(ConstUtil.HOST_APP + ConstUtil.apkURL
               ,new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                if (response.isSuccessful()) {
                    Log.d(TAG, "server contacted and has file");
                    new Thread(new FileDownloadRun(response,downloadApkListener)).start();
                } else {
                    Log.d(TAG, "server contact failed");
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                Log.e(TAG, "error");
            }
        });

    }

    public class FileDownloadRun implements Runnable{
        Response<ResponseBody> mResponseBody;
        DownloadApkListener mDownloadApkListener;
        public FileDownloadRun(Response<ResponseBody> responseBody,
                               final DownloadApkListener downloadApkListener){
            mResponseBody = responseBody;
            mDownloadApkListener = downloadApkListener;
        }

        @Override
        public void run() {
            writeResponseBodyToDisk(mResponseBody.body(),mDownloadApkListener);
        }
    }


    /**
     *
     * @param body
     * @param downloadListener
     * @return
     */
    private boolean writeResponseBodyToDisk(ResponseBody body,final DownloadApkListener downloadListener) {
        if (downloadListener!=null)
            downloadListener.onStart();
        try {
            // 改成自己需要的存储位置
            File file = new File(ConstUtil.dir_appname+ File.separator + "yunjia.apk");
            Log.e(TAG,"writeResponseBodyToDisk() file="+file.getPath());
            if (file.exists()) {
                file.delete();
            }
            InputStream inputStream = null;
            OutputStream outputStream = null;

            try {
                byte[] fileReader = new byte[4096];

                long fileSize = body.contentLength();
                long fileSizeDownloaded = 0;

                inputStream = body.byteStream();
                outputStream = new FileOutputStream(file);

                while (true) {
                    int read = inputStream.read(fileReader);

                    if (read == -1) {
                        break;
                    }

                    outputStream.write(fileReader, 0, read);

                    fileSizeDownloaded += read;

                    //计算当前下载百分比,并经由回调传出
                    if (downloadListener!=null)
                        downloadListener.onProgress((int) (100 * fileSizeDownloaded / fileSize));
                    Log.d(TAG, "file download: " + fileSizeDownloaded + " of " + fileSize);
                }

                if (downloadListener!=null)
                    downloadListener.onFinish(file.getPath());
                outputStream.flush();

                return true;
            } catch (IOException e) {
                if (downloadListener!=null)
                    downloadListener.onError(""+e.getMessage());
                return false;
            } finally {
                if (inputStream != null) {
                    inputStream.close();
                }

                if (outputStream != null) {
                    outputStream.close();
                }
            }
        } catch (IOException e) {
            return false;
        }
    }

相关文章

网友评论

      本文标题:Android retrofit2 大文件下载

      本文链接:https://www.haomeiwen.com/subject/galvkqtx.html