`
夏文权
  • 浏览: 242810 次
  • 性别: Icon_minigender_1
  • 来自: 贵州
社区版块
存档分类
最新评论

java android 多线程下载

阅读更多
package xiawenquan.com;

import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
/**
 * 多线程下载
 * @author xiawenquan
 *
 */
public class MyDownLoad {
	
	public static void main(String[] args) {
		
		String path = "http://gb.cri.cn/mmsource/images/2011/10/22/a817ae91a2bb48e59c40673a9694b5fb.jpg";
		new MyDownLoad().download(path,3);

	}

	/**
	 * 根据路径和线程数下载文件
	 * @param path
	 * @param threadSize
	 */
	private void download(String path, int threadSize) {
		try {
			URL url = new URL(path);
			HttpURLConnection connection = (HttpURLConnection) url.openConnection();
			connection.setReadTimeout(60*1000);
			connection.setRequestMethod("GET");
			if(connection.getResponseCode() == 200){
				int fileLength = connection.getContentLength();
				File file = new File(getFileNameByPath(path));
				RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");
				accessFile.setLength(fileLength);
				accessFile.close();
				// 计算每条线程下载的数据量,如果不整除则加上1
				int block = fileLength / threadSize == 0 ? fileLength / threadSize : fileLength / threadSize + 1;
				for(int threadid = 0; threadid < threadSize; threadid ++){
					new DownLoad(threadid,block,url,file).start();
				}
				
			}else{
				System.out.println("下载失败!");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 根据路径获取文件名称
	 * @param path
	 * @return
	 */
	private String getFileNameByPath(String path) {
		String fileName = path.substring(path.lastIndexOf("/" ) + 1);
		return fileName;
	}

	// 负责下载的线程类
	private class DownLoad extends Thread{
		private int threadid;
		private int block;
		private URL url;
		private File file;
		
		public DownLoad(int threadid, int block, URL url, File file) {
			this.threadid = threadid;
			this.block = block;
			this.url = url;
			this.file = file;
		}
		
		@Override
		public void run() { // TODO 这个run()是每个线程下载的代码
			try {
				int start = threadid * block ; // 计算线程下载的开始位置
				int end = (threadid + 1) * block - 1;// 计算线程下载的结束位置
				RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");
				accessFile.seek(start); // seek()是使每一条线程在本地文件file中的什么位置开始写入数据
				// 然后每条线程去连网
				HttpURLConnection connection = (HttpURLConnection) url.openConnection();
				connection.setReadTimeout(60*1000);
				connection.setRequestMethod("GET");
				connection.setRequestProperty("Range", "bytes=" + start + "-" + end );
				if(connection.getResponseCode() == 206){ // 分段下载的返回码不是200,而是206
					InputStream inputStream = connection.getInputStream(); // 获取网络返回来的数据,返回来的数据是每一条线程的下载的数据
					byte buffer[] = new byte[1024];
					int len = 0;
					while ((len = inputStream.read(buffer)) != -1) {
						accessFile.write(buffer, 0, len);
					}
					accessFile.close();
					inputStream.close();
					System.out.println("第" + (threadid + 1) + "条线程下载完成");
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}
 
  • 大小: 145.2 KB
分享到:
评论

相关推荐

    Android多线程下载实现方案

    总结,Android多线程下载是提升用户体验的重要手段,通过合理地划分任务、并发执行、同步合并,以及断点续传,可以有效地提高下载效率,减少用户等待时间。`demo.apk`是一个很好的实践案例,值得开发者深入研究。

    android多线程下载

    通过以上步骤,我们可以实现一个功能完善的Android多线程下载器,它支持暂停、断点续传,并能够根据用户需求进行定制。在项目实践中,务必注意线程同步和数据一致性,以保证下载的正确性。 最后,提供的...

    Android实现多线程下载

    在Android平台上,多线程下载是一项重要的技术,它允许应用程序同时从服务器获取数据,从而显著提高了文件下载的速度和效率。本教程将深入讲解如何在Android环境中实现多线程下载功能,以及涉及的相关知识点。 首先...

    Java / Android 基于Http的多线程下载的实现

    总的来说,Java和Android中的多线程下载是通过合理地分配任务给多个线程,同时处理文件的不同部分,以提高下载效率。理解并掌握这一技术对于优化移动应用的性能和用户体验至关重要。在实际开发中,还应考虑其他因素...

    android 多线程下载源代码

    在Android开发中,多线程下载是一项常见的任务,特别是在处理大文件时,为了提高下载速度和用户体验,通常会采用多线程技术。本资源提供的"android 多线程下载源代码"是一个很好的学习资料,可以帮助开发者理解并...

    Android 多线程下载简单demo之Thread

    在Android开发中,多线程下载是一项常见的任务,它能够有效地利用网络资源并提升用户体验。本文将基于提供的标题“Android 多线程下载简单demo之Thread”和描述,深入讲解如何实现一个简单的多线程下载功能。这个...

    Android多线程下载服务器资源

    通过上述步骤,我们可以实现高效且可中断的Android多线程下载。而`MultiDownLoadDemo`这个文件可能是一个示例代码或者项目,你可以参考它来理解和实现多线程下载功能。记住,实际开发中还需要考虑错误处理、网络状态...

    Android多线程文件上传

    本主题聚焦于"Android多线程文件上传",我们将探讨如何利用多线程技术来优化文件上传过程,提高效率,并确保应用的响应性。 一、多线程基础 多线程是并发执行多个任务的能力,它允许应用程序同时处理多个任务,提高...

    Android多线程下载

    在Android开发中,多线程下载是一项...综上所述,Android多线程下载涉及到线程池管理、异步处理、文件分块、断点续传、错误处理等多个关键点。通过合理的设计和实现,可以显著提升应用的下载性能,提供更好的用户体验。

    Android Java 多线程下载文件 demo

    最后,关于文档`http://blog.csdn.net/sinat_29398599/article/details/52921172`,它提供了一个具体的Android多线程下载文件的实例,包括代码示例和详细的解释,对于初学者来说是非常有价值的参考资料。 综上所述...

    Android JNI多线程编程回调JAVA函数

    本话题将深入探讨如何在Android中使用JNI进行多线程编程,并实现native方法对Java函数的回调。 1. **JNI基础知识**: - JNI是Java平台的一部分,为Java应用程序提供了与本地代码交互的能力。开发者可以通过JNI在...

    Java源码,android多线程下载器演示

    总之,这个Java源码示例涵盖了Android多线程下载器的关键技术和设计思路,包括线程池的使用、断点续传的实现、后台任务处理以及进度更新。通过学习和理解这个示例,开发者可以更好地掌握在Android环境中实现高效、...

    android多线程下载器

    通过实现这个android多线程下载器,你不仅能提升Android开发技能,还能深入了解网络通信、并发编程以及资源管理等多个重要领域。这将对你的Android开发者生涯产生积极影响,帮助你在面对复杂项目时更有信心。

    java多线程下载图片

    在这个场景中,"java多线程下载图片"意味着我们将探讨如何使用Java来实现一个能够异步下载多个图片的系统。 首先,我们需要理解Java中的线程是如何创建和运行的。Java提供了两种创建线程的方式:继承Thread类和实现...

    Android多线程下载器

    以下是对这个“Android多线程下载器”相关知识点的详细阐述: 1. **多线程概念**:多线程是程序执行时的一种并发机制,可以让程序同时执行多个不同的任务。在Android系统中,主线程(UI线程)负责处理用户交互和...

    android java 多线程下载工具类调用一个方法即可

    这个“android java 多线程下载工具类”应该是为了简化这一过程而设计的,通过调用一个方法就能实现多线程下载功能。下面我们将深入探讨多线程下载的原理以及如何在Android中实现。 1. **多线程下载原理**: - 多...

    Android 多线程断点续传下载

    在Android开发中,多线程断点续传...总之,Android多线程断点续传下载技术是提高用户体验的重要手段,涉及到了网络编程、多线程、文件操作、线程通信等多个技术领域,需要开发者具备扎实的基础和良好的问题解决能力。

    android studio多线程下载

    在Android开发中,多线程下载是一项常见的技术,特别是在处理大文件或网络资源时,为了提高下载速度和用户体验,开发者通常会采用多线程来分块下载数据。Android Studio作为官方推荐的Android集成开发环境,提供了...

    Android多线程下载文件实例

    总结起来,Android多线程下载文件涉及到的关键知识点包括:多线程编程(`Thread`或`AsyncTask`)、网络通信(`URL`和`HttpURLConnection`)、文件操作(`java.io`)、线程同步与进度更新(`Handler`)、异常处理和...

    android 单线程 多线程下载

    本文主要探讨的是如何在Android平台上实现单线程和多线程下载,这是一项重要的技术,尤其在处理大文件或者需要后台持续运行的任务时。我们将从源码分析、工具应用等方面进行详细讲解。 首先,我们了解下Android中的...

Global site tag (gtag.js) - Google Analytics