011】【多线程下载】

Android学习目录项目源码下载多线程下载

原理:服务器CPU分配给每条线程的时间片相同,服务器带宽平均分配给每条线程,所以客户端开启的线程越多,就能抢占到更多的服务器资源

确定每条线程下载多少数据发送http请求至下载地址String path = “http://192.168.1.102:8080/editplus.exe”;URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setReadTimeout(5000);conn.setConnectTimeout(5000);conn.setRequestMethod(“GET”);获取文件总长度,然后创建长度一致的临时文件if(conn.getResponseCode() == 200){//获得服务器流中数据的长度int length = conn.getContentLength();//创建一个临时文件存储下载的数据RandomAccessFile raf = new RandomAccessFile(getFileName(path), “rwd”);//设置临时文件的大小raf.setLength(length);raf.close();确定线程下载多少数据//计算每个线程下载多少数据int blockSize = length / THREAD_COUNT;计算每条线程下载数据的开始位置和结束位置for(int id = 1; id <= 3; id++){//计算每个线程下载数据的开始位置和结束位置int startIndex = (id – 1) * blockSize;int endIndex = id * blockSize – 1;if(id == THREAD_COUNT){endIndex = length;}//开启线程,按照计算出来的开始结束位置开始下载数据new DownLoadThread(startIndex, endIndex, id).start();}再次发送请求至下载地址,请求开始位置至结束位置的数据String path = “http://192.168.1.102:8080/editplus.exe”;URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setReadTimeout(5000);conn.setConnectTimeout(5000);conn.setRequestMethod(“GET”);//向服务器请求部分数据conn.setRequestProperty(“Range”, “bytes=” + startIndex + “-” + endIndex);conn.connect();* 下载请求到的数据,存放至临时文件中if(conn.getResponseCode() == 206){InputStream is = conn.getInputStream();RandomAccessFile raf = new RandomAccessFile(getFileName(path), “rwd”);//指定从哪个位置开始存放数据raf.seek(startIndex);];int len;while((len = is.read(b)) != -1){raf.write(b, 0, len);}raf.close();}带断点续传的多线程下载定义一个int变量记录每条线程下载的数据总长度,然后加上该线程的下载开始位置,得到的结果就是下次下载时,该线程的开始位置,把得到的结果存入缓存文件//用来记录当前线程总的下载长度int total = 0;while((len = is.read(b)) != -1){raf.write(b, 0, len);total += len;//每次下载都把新的下载位置写入缓存文本文件RandomAccessFile raf2 = new RandomAccessFile(threadId + “.txt”, “rwd”);raf2.write((startIndex + total + “”).getBytes());raf2.close();}下次下载开始时,先读取缓存文件中的值,得到的值就是该线程新的开始位置FileInputStream fis = new FileInputStream(file);BufferedReader br = new BufferedReader(new InputStreamReader(fis));String text = br.readLine();int newStartIndex = Integer.parseInt(text);//把读到的值作为新的开始位置startIndex = newStartIndex;fis.close();三条线程都下载完毕之后,删除缓存文件RUNNING_THREAD–;if(RUNNING_THREAD == 0){for(int i = 0; i <= 3; i++){File f = new File(i + “.txt”);f.delete();}}手机版的断点续传多线程下载器把刚才的代码直接粘贴过来就能用,记得在访问文件时的路径要改成Android的目录,添加访问网络和外部存储的路径用进度条显示下载进度拿到下载文件总长度时,设置进度条的最大值//设置进度条的最大值pb.setMax(length);进度条需要显示三条线程的整体下载进度,所以三条线程每下载一次,就要把新下载的长度加入进度条 定义一个int全局变量,记录三条线程的总下载长度int progress;* 刷新进度条while((len = is.read(b)) != -1){raf.write(b, 0, len);//把当前线程本次下载的长度加到进度条里progress += len;pb.setProgress(progress);每次断点下载时,从新的开始位置开始下载,进度条也要从新的位置开始显示,在读取缓存文件获取新的下载开始位置时,也要处理进度条进度FileInputStream fis = new FileInputStream(file);BufferedReader br = new BufferedReader(new InputStreamReader(fis));String text = br.readLine();int newStartIndex = Integer.parseInt(text);//新开始位置减去原本的开始位置,,得到已经下载的数据长度int alreadyDownload = newStartIndex – startIndex;//把已经下载的长度设置入进度条progress += alreadyDownload;添加文本框显示百分比进度tv.setText(progress * 100 / pb.getMax() + “%”);HttpUtils的使用 幸运并非没有恐惧和烦恼;厄运并非没有安慰与希望。

011】【多线程下载】

相关文章:

你感兴趣的文章:

标签云: