欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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();
    		}
    	}
    }