美文网首页
文件下载

文件下载

作者: 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();
        }
    }

相关文章

  • Android 零碎知识点和技巧

    使用DownloadManager下载文件 下载文件 监听下载结果 文件下载断点续传 1.获取已下载的文件长度. ...

  • js文件下载

    1.文件流下载 根据后台接口文件流下载 调用 2.文件地址下载 根据文件地址下载文件 调用 3.base64流下载...

  • wget下载数据

    下载单个文件 -nc: 继续下载中断的操作 下载目录下面所有文件 下载多个文件:

  • 文件下载

    由于不同的浏览器兼容不同,对于直接a标签下载文件,有的浏览器可以,有的浏览器会直接播放。为了保证下载操作的正确执行...

  • 文件下载

    常见的文件格式: 文件下载HTML 图片文件下载PHP

  • 文件下载

    IOUtils 的对应包 需要关闭流的对象放在try()内不用写关闭代码

  • 文件下载

    文件下载是实际项目中经常用的一个接口,不同于图片下载客户端自己保存就可以了,需要开放对应的接口。同时,一般会结合P...

  • 文件下载

    1.小文件下载 1.1下载方式 【NSData dataWithContentsOfURL:】 [NSURLCon...

  • 文件下载

  • 文件下载

    初始化下载管理器 添加下载 下载数据管理 创建请求 Get Post Delegate 下载数据本地化 创建任务 ...

网友评论

      本文标题:文件下载

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