Android实现单任务线程队列 博客分类: Android_笔记 单任务线程Android多线程下载水啊
程序员文章站
2024-03-17 09:09:46
...
这是项目中遇到的一个问题,需要解析一个xml文件,得到要下载的文件列表,根据该文件列表来下载数据包。刚开始一直想用使用for、while等流程控制语句。但导致的结构就是开启了多个线程。可是,实际上只能开启一个任务,该任务为下载列表中某个数据包的下载任务,而该下载任务则是使用多线程下载实现的。
后来,因为涉及到当前下载进度的统计和反馈,越写越乱。于是又重新写了个测试程序,突然想到可以使用递归实现单任务的线程队列。于是,这个问题就就解决了,在这里mark一下,基础水平太差啊,不是专业出身,就该更加努力啊!!!
public void startDownload() { HttpURLConnection connection = null; RandomAccessFile randomAccessFile = null; InputStream is = null; try { URL url = new URL(URL_PATH + this.dataPaths[downloadFlag]); connection = (HttpURLConnection)url.openConnection(); connection.setConnectTimeout(5000); connection.setRequestMethod("GET"); int fileSize = connection.getContentLength(); //设置数据范围,格式为Range:bytes x-y //connection.setRequestProperty("Range", "bytes=0-" + fileSize); File file = new File(localFile + dataPaths[downloadFlag]); if(!file.exists()) { file.createNewFile(); } randomAccessFile = new RandomAccessFile(localFile + dataPaths[downloadFlag], "rwd"); randomAccessFile.seek(0); //将要下载的文件写到保存路径中 is = connection.getInputStream(); byte[] buffer = new byte[4096]; //每次读取的数据量 int length = -1; while((length = is.read(buffer)) != -1) { randomAccessFile.write(buffer, 0, length); } //递归方法,下载下一个数据包 downloadFlag ++; if(downloadFlag < this.dataPaths.length) { startDownload(); } } catch(Exception e){ e.printStackTrace(); } finally { try { is.close(); randomAccessFile.close(); connection.disconnect(); } catch(Exception e){ e.printStackTrace(); } } }