Android retrofit2 大文件下载

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;
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载请注明出处(https://www.jianshu.com/p/5f538820e370),您的打赏是小编继续...
    福later阅读 28,126评论 8 73
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,144评论 1 32
  • 《裕语言》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 27,847评论 5 19
  • 春天真美好,花香,树绿,草青。 春天真美好,天晴,风暖,月明。 春天真美好,猫叫,狗吠,人骚。
    花生zfh阅读 368评论 0 0
  • “坚持住,时间快到了,还有8秒,坚持住,快点,快,快...”一位父亲正在鼓励他的小孩,小步的跑在小孩前面,时...
    海边山人阅读 365评论 0 0