Android实现单任务线程队列

      这是项目中遇到的一个问题,需要解析一个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();
    		}
    	}
    }
 

猜你喜欢

转载自wly1028.iteye.com/blog/1647925