美文网首页
文件下载

文件下载

作者: HOLLE_karry | 来源:发表于2020-05-21 18:03 被阅读0次

    1.OkHttp下载文件

    public static void okDownload(String url, final String path){
            String savaFile = "/storage/emulated/0/a.apk";
            OkHttpClient okHttpClient = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(url)
                    .get()
                    .build();
            //异步调用,不用再新建线程了
            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                 //第一个0表示失败,第二个0表示进度,第三个0表示最大进度,失败都为0
                    EventBus.getDefault().post(new MsgE(0,0,0));
                }
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    InputStream inputStream = response.body().byteStream();
                    long max = response.body().contentLength();//得到文件的大小
                    savaFile(savaFile,inputStream,max);//保存文件到本地
                }
            });
        }
    

    2.Retrofit下载

    new Retrofit.Builder()
                    .baseUrl(ApiService.url_load)
                    .build()
                    .create(ApiService.class)
                    .getLoad()
                    .enqueue(new Callback<ResponseBody>() {
                        @Override
                        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                            final long max = response.body().contentLength();
                            final InputStream in = response.body().byteStream();
                            new Thread() {
                                @Override
                                public void run() {
                                    super.run();
                                    saveFile(file, max, in);
                                }
                            }.start();
                        }
    
                        @Override
                        public void onFailure(Call<ResponseBody> call, Throwable t) {
    
                        }
                    });
    

    3.HttpUrlConnection下载

    public class ThreadManager {
        private static ThreadManager mManager;
        private final ThreadPoolExecutor mExecutor;
        private ThreadManager(){
            mExecutor = new ThreadPoolExecutor(5,//核心线程数量,核心池的大小
                    20,//线程池最大线程数
                    30,//表示线程没有任务执行时最多保持多久时间会终止
                    TimeUnit.SECONDS,//时间单位
                    new LinkedBlockingQueue<Runnable>(),//任务队列,用来存储等待执行的任务
                    Executors.defaultThreadFactory(),//线程工厂,如何去创建线程的
                    new ThreadPoolExecutor.AbortPolicy());
        }
        public static ThreadManager getInstance(){
            if (mManager == null){
                synchronized (ThreadManager.class){
                    if (mManager == null){
                        mManager = new ThreadManager();
                    }
                }
            }
            return mManager;
        }
        /**
         * 执行任务
         */
        public void execute(Runnable runnable){
            if(runnable==null) return;
            mExecutor.execute(runnable);
        }
        /**
         * 从线程池中移除任务
         */
        public void remove(Runnable runnable){
            if(runnable==null)return;
            mExecutor.remove(runnable);
        }
    }
    
    public static void httpDownload(final String url, final String path, final ResultCallBack callBack) {
            ThreadManager.getInstance().execute(new Runnable() {
                @Override
                public void run() {
                //由线程池提供线程
                    try {
                        String savaFile  = new File("/storage/emulated/0/c.apk");
                        URL url1 = new URL(url);
                        HttpURLConnection conn = (HttpURLConnection) url1.openConnection();
                        int responseCode = conn.getResponseCode();
                        if (responseCode == 200){
                            InputStream inputStream = conn.getInputStream();
                            int max = conn.getContentLength();
                            savaFile(savaFile,inputStream,max);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        callBack.onFail(e.getMessage());
                    }
                }
            });
        }
    

    4.saveFile

    private void saveFile(File file, long max, InputStream in) {
            EventBus.getDefault().post(new ProgressEvent(1, 0,(int) max,  0));
            try {
                FileOutputStream out = new FileOutputStream(file);
                int len = 0;
                int count = 0;
                byte[] bytes = new byte[1024 * 4];
                while ((len = in.read(bytes)) != -1) {
                    out.write(bytes, 0, len);
                    count += len;
                    int l = (int) ((float) (count / max) * 100);
                    EventBus.getDefault().post(new ProgressEvent(2,  count,(int) max, l));
                }
                out.close();
                in.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    相关文章

      网友评论

          本文标题:文件下载

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