美文网首页
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