一、自己封装URLConnection 连接请求类

   public void downloadFile1() {    try{        //下载路径,如果路径无效了,可换成你的下载路径        String url = "http://c.qijingonline.com/test.mkv";        String path = Environment.getExternalStorageDirectory().getAbsolutePath();        final long startTime = System.currentTimeMillis();        Log.i("DOWNLOAD","startTime="+startTime);        //下载函数       String filename=url.substring(url.lastIndexOf("/") + 1);        //获取文件名        URL myURL = new URL(url);        URLConnection conn = myURL.openConnection();        conn.connect();        InputStream is = conn.getInputStream();        int fileSize = conn.getContentLength();//根据响应获取文件大小        if (fileSize <= 0) throw new RuntimeException("无法获知文件大小 ");        if (is == null) throw new RuntimeException("stream is null");        File file1 = new File(path);        if(!file1.exists()){            file1.mkdirs();        }        //把数据存入路径+文件名        FileOutputStream fos = new FileOutputStream(path+"/"+filename);        byte buf[] = new byte[1024];        int downLoadFileSize = 0;        do{            //循环读取            int numread = is.read(buf);            if (numread == -1)            {                break;            }            fos.write(buf, 0, numread);            downLoadFileSize += numread;            //更新进度条        } while (true);        Log.i("DOWNLOAD","download success");        Log.i("DOWNLOAD","totalTime="+ (System.currentTimeMillis() - startTime));        is.close();    } catch (Exception ex) {        Log.e("DOWNLOAD", "error: " + ex.getMessage(), ex);    }}
这种方式在Android 刚兴起的时候,很少下载封装框架,就自己封装了。虽然一般的文件都能下载,但这种方式缺点很多,不稳定或者各种各样的问题会出现。

二、Android自定的下载管理(会在notification 显示下载的进度,同时可以暂停、重新连接等)

private void downloadFile2(){    //下载路径,如果路径无效了,可换成你的下载路径    String url = "http://c.qijingonline.com/test.mkv";    //创建下载任务,downloadUrl就是下载链接    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));    //指定下载路径和下载文件名    request.setDestinationInExternalPublicDir("", url.substring(url.lastIndexOf("/") + 1));    //获取下载管理器    DownloadManager downloadManager= (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);    //将下载任务加入下载队列,否则不会进行下载    downloadManager.enqueue(request);}

这种方式其实就是交给了Android系统的另一个app去下载管理。这样的好处不会消耗该APP的 CPU资源。缺点是:控制起来很不灵活。


三、使用第三方 okhttp 网络请求框架

private void downloadFile3(){    //下载路径,如果路径无效了,可换成你的下载路径    final String url = "http://c.qijingonline.com/test.mkv";    final long startTime = System.currentTimeMillis();    Log.i("DOWNLOAD","startTime="+startTime);    Request request = new Request.Builder().url(url).build();    new OkHttpClient().newCall(request).enqueue(new Callback() {        @Override        public void onFailure(Call call, IOException e) {            // 下载失败            e.printStackTrace();            Log.i("DOWNLOAD","download failed");        }        @Override        public void onResponse(Call call, Response response) throws IOException {            Sink sink = null;            BufferedSink bufferedSink = null;            try {                String mSDCardPath= Environment.getExternalStorageDirectory().getAbsolutePath();                File dest = new File(mSDCardPath,   url.substring(url.lastIndexOf("/") + 1));                sink = Okio.sink(dest);                bufferedSink = Okio.buffer(sink);                bufferedSink.writeAll(response.body().source());                bufferedSink.close();                Log.i("DOWNLOAD","download success");                Log.i("DOWNLOAD","totalTime="+ (System.currentTimeMillis() - startTime));            } catch (Exception e) {                e.printStackTrace();                Log.i("DOWNLOAD","download failed");            } finally {                if(bufferedSink != null){                    bufferedSink.close();                }            }        }    });}
okhttp是一个很有名气的开源框架,目前已经很多大公司都直接使用它作为网络请求库(七牛云SDK, 阿里云SDK)。 且里面集成了很多优势,包括 okio (一个I/O框架,优化内存与CPU)。   综合来看,第三种方案是最佳的,是目前最流行的下载方案。

更多相关文章

  1. Android(安卓)Intent调用 Uri的使用几种格式
  2. android 模拟器常用命令
  3. 用RelativeLayout布局可以在imageview中写上文字
  4. Android获取机身存储、内置SD卡与外置TF卡路径
  5. android系统移植学习笔记一
  6. 使用intent调用Android系统自带应用
  7. android 加载动态库
  8. Android共享数据ContentProvider的使用
  9. android 学习之安装

随机推荐

  1. Activity的启动流程
  2. Android 音量增加减少按钮事件
  3. android调用系统的相机服务
  4. AIDL
  5. android--------Android Studio常见问题
  6. wav格式
  7. Android Studio 修改api level
  8. android基础:动画案例(图片翻转)
  9. Android面试-基础知识
  10. javascript获取Android设备版本信息(备忘)