android 版本跟新之下载
16lz
2021-12-04
public class DownloadUtil { public static final int DOWNLOAD_FAIL=0; public static final int DOWNLOAD_PROGRESS=1; public static final int DOWNLOAD_SUCCESS=2; private static DownloadUtil downloadUtil; private final OkHttpClient okHttpClient; public static DownloadUtil getInstance() { if (downloadUtil == null) { downloadUtil = new DownloadUtil(); } return downloadUtil; } private DownloadUtil() { okHttpClient = new OkHttpClient(); } /** * */ public void download(final String url,final String saveDir,final OnDownloadListener listener){ this.listener=listener; Request request=new Request.Builder().url(url).build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Message message=Message.obtain(); message.what=DOWNLOAD_FAIL; mHandler.sendMessage(message); } @Override public void onResponse(Call call, Response response) throws IOException { InputStream is=null; byte[] buf=new byte[2048]; int len=0; FileOutputStream fos=null; //储存下载文件的目录 String savePath=isExistDir(saveDir); File file=new File(savePath,getNameFromUrl(url)); if (file.exists()){ file.delete(); } try{ is=response.body().byteStream(); long total=response.body().contentLength(); File file2=new File(savePath,getNameFromUrl(url)); fos=new FileOutputStream(file2); long sum=0; while((len = is.read(buf))!=-1){ fos.write(buf,0,len); sum+=len; int progress=(int)(sum*100/total); //下载中 Message message=Message.obtain(); message.what=DOWNLOAD_PROGRESS; message.obj=progress; mHandler.sendMessage(message); } fos.flush(); //下载完成 Message message=Message.obtain(); message.what=DOWNLOAD_SUCCESS; message.obj=file.getAbsolutePath(); mHandler.sendMessage(message); }catch (Exception e){ Message message=Message.obtain(); message.what=DOWNLOAD_FAIL; mHandler.sendMessage(message); }finally{ try{ if(is!=null) is.close(); }catch (IOException e){ } try { if(fos!=null){ fos.close(); } }catch (IOException e){ } } } }); } private String getNameFromUrl(String url) { return url.substring(url.lastIndexOf("/")+1); } private String isExistDir(String saveDir) throws IOException { File downloadFile=new File(saveDir); if(!downloadFile.mkdirs()){ downloadFile.createNewFile(); } String savePath=downloadFile.getAbsolutePath(); return savePath; } private Handler mHandler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case DOWNLOAD_PROGRESS: listener.onDownloading((Integer) msg.obj); break; case DOWNLOAD_FAIL: listener.onDownloadFailed(); break; case DOWNLOAD_SUCCESS: listener.onDownloadSuccess((String) msg.obj); break; } } }; OnDownloadListener listener; public interface OnDownloadListener{ /** * 下载成功 */ void onDownloadSuccess(String path); /** * 下载进度 * @param progress */ void onDownloading(int progress); /** * 下载失败 */ void onDownloadFailed(); }}
更多相关文章
- android中进度条和选项卡的使用
- 使用Android新式LruCache缓存图片,基于线程池异步加载图片
- android studio 57 MP3 音乐播放器 下载网络歌曲 代码
- Android文件下载程序例子
- NDK旧版本下载地址
- android中自定义进度条风格
- android 多线程并发下载文件
- android 实现图片加载效果
- Android文件下载