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文件下载三种基本方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!