Android 文件下载三种基本方式
一、自己封装URLConnection连接请求类
publicvoiddownloadFile1(){ try{ //下载路径,如果路径无效了,可换成你的下载路径 Stringurl="http://c.qijingonline.com/test.mkv"; Stringpath=Environment.getExternalStorageDirectory().getAbsolutePath(); finallongstartTime=System.currentTimeMillis(); Log.i("DOWNLOAD","startTime="+startTime); //下载函数 Stringfilename=url.substring(url.lastIndexOf("/")+1); //获取文件名 URLmyURL=newURL(url); URLConnectionconn=myURL.openConnection(); conn.connect(); InputStreamis=conn.getInputStream(); intfileSize=conn.getContentLength();//根据响应获取文件大小 if(fileSize<=0)thrownewRuntimeException("无法获知文件大小"); if(is==null)thrownewRuntimeException("streamisnull"); Filefile1=newFile(path); if(!file1.exists()){ file1.mkdirs(); } //把数据存入路径+文件名 FileOutputStreamfos=newFileOutputStream(path+"/"+filename); bytebuf[]=newbyte[1024]; intdownLoadFileSize=0; do{ //循环读取 intnumread=is.read(buf); if(numread==-1) { break; } fos.write(buf,0,numread); downLoadFileSize+=numread; //更新进度条 }while(true); Log.i("DOWNLOAD","downloadsuccess"); Log.i("DOWNLOAD","totalTime="+(System.currentTimeMillis()-startTime)); is.close(); }catch(Exceptionex){ Log.e("DOWNLOAD","error:"+ex.getMessage(),ex); } }
这种方式在Android刚兴起的时候,很少下载封装框架,就自己封装了。虽然一般的文件都能下载,但这种方式缺点很多,不稳定或者各种各样的问题会出现。
二、Android自定的下载管理(会在notification显示下载的进度,同时可以暂停、重新连接等)
privatevoiddownloadFile2(){ //下载路径,如果路径无效了,可换成你的下载路径 Stringurl="http://c.qijingonline.com/test.mkv"; //创建下载任务,downloadUrl就是下载链接 DownloadManager.Requestrequest=newDownloadManager.Request(Uri.parse(url)); //指定下载路径和下载文件名 request.setDestinationInExternalPublicDir("",url.substring(url.lastIndexOf("/")+1)); //获取下载管理器 DownloadManagerdownloadManager=(DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE); //将下载任务加入下载队列,否则不会进行下载 downloadManager.enqueue(request); }
这种方式其实就是交给了Android系统的另一个app去下载管理。这样的好处不会消耗该APP的CPU资源。缺点是:控制起来很不灵活。
三、使用第三方okhttp网络请求框架
privatevoiddownloadFile3(){ //下载路径,如果路径无效了,可换成你的下载路径 finalStringurl="http://c.qijingonline.com/test.mkv"; finallongstartTime=System.currentTimeMillis(); Log.i("DOWNLOAD","startTime="+startTime); Requestrequest=newRequest.Builder().url(url).build(); newOkHttpClient().newCall(request).enqueue(newCallback(){ @Override publicvoidonFailure(Callcall,IOExceptione){ //下载失败 e.printStackTrace(); Log.i("DOWNLOAD","downloadfailed"); } @Override publicvoidonResponse(Callcall,Responseresponse)throwsIOException{ Sinksink=null; BufferedSinkbufferedSink=null; try{ StringmSDCardPath=Environment.getExternalStorageDirectory().getAbsolutePath(); Filedest=newFile(mSDCardPath,url.substring(url.lastIndexOf("/")+1)); sink=Okio.sink(dest); bufferedSink=Okio.buffer(sink); bufferedSink.writeAll(response.body().source()); bufferedSink.close(); Log.i("DOWNLOAD","downloadsuccess"); Log.i("DOWNLOAD","totalTime="+(System.currentTimeMillis()-startTime)); }catch(Exceptione){ e.printStackTrace(); Log.i("DOWNLOAD","downloadfailed"); }finally{ if(bufferedSink!=null){ bufferedSink.close(); } } } }); }
okhttp是一个很有名气的开源框架,目前已经很多大公司都直接使用它作为网络请求库(七牛云SDK,阿里云SDK)。且里面集成了很多优势,包括okio(一个I/O框架,优化内存与CPU)。
以上所述是小编给大家介绍的Android文件下载三种基本方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!