Android_线程_多线程下载

多线程下载图示:



代码:

import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

/**
 * 多线程下载
 * 
 * 1.获取到服务器端资源文件的大小,并在客户端创建与服务器端资源文件大小相等的文件
 * 
 * 2.根据开启的线程数量把服务器端的资源平均分成若干份
 * 
 * 3.根据http协议去下载
 * 
 * @author 两点水
 * 
 */
public class MutileThreadDownload {

	// 线程的数量
	private static int threadCount = 3;
	// 每个下载区块的大小
	private static long blocksize;
	// 正在运行的线程的数量
	private static int runningThreadCount;

	public static void main(String[] args) throws Exception {

		// 服务器文件的路径
		String path = "http://localhost:8080/Day4/putty_V0.63.0.0.43510830.exe";
		URL url = new URL(path);
		// 连接服务器
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET");
		conn.setConnectTimeout(5000);
		int code = conn.getResponseCode();
		if (code == 200) { // 连接服务器成功
			// 得到服务器返回的文件的大小
			long length = conn.getContentLength();
			System.out.println("服务器端资源文件的大小:" + length);

			// 在本地创建一个和服务器端资源文件大小相等的空白文件
			File file = new File("putty.exe");
			RandomAccessFile raf = new RandomAccessFile(file, "rw"); // 对文件设置读写的权限
			raf.setLength(length); // 设置文件的大小

			// 开启若干个线程进行下载(需要常量:开启线程的的数量,每一个线程下载的大小,每一个线程下载的区域)
			blocksize = length / threadCount;
			runningThreadCount = threadCount;
			for (int i = 1; i <= threadCount; i++) {
				// 循环开启线程,确定每个线程下载的区域,开始的位置和结束的为位置,文件的大小读写都是从0开始的
				long startIndex = (i - 1) * blocksize; // 开始的位置
				long endIndex = i * blocksize - 1; // 结束的位置
				// 最后一个线程结束的位置比较特殊,所以要处理一下
				if (i == threadCount) {
					// 最后一个线程,结束的位置是服务器资源文件的大小
					endIndex = length - 1;
				}
				System.out.println("开启线程:" + i + "下载的位置:" + startIndex + "~"
						+ endIndex);
				new DownloadThread(i, startIndex, endIndex, path).start();
			}

		}
		conn.disconnect();

	}

	/**
	 * 下载的线程内部类
	 * 
	 * @author 两点水
	 * 
	 */
	private static class DownloadThread extends Thread {

		private int threadId; // 线程的ID
		private long startIndex; // 线程下载块开始的位置
		private long endIndex; // 线程下载块结束的位置
		private String path; // 文件的路径

		public DownloadThread(int threadId, long startIndex, long endIndex,
				String path) {
			this.threadId = threadId;
			this.startIndex = startIndex;
			this.endIndex = endIndex;
			this.path = path;
		}

		@Override
		public void run() {
			try {
				URL url = new URL(path);
				HttpURLConnection conn = (HttpURLConnection) url
						.openConnection();
				conn.setRequestMethod("GET");
				conn.setRequestProperty("Range", "bytes=" + startIndex + "-"
						+ endIndex);
				conn.setConnectTimeout(5000);
				int code = conn.getResponseCode();
				System.out.println("code=" + code);
				InputStream is = conn.getInputStream();
				File file = new File("putty.exe");
				RandomAccessFile raf = new RandomAccessFile(file, "rw");
				// 指定的位置开始读写
				raf.seek(startIndex);
				System.out.println("第" + threadId + "个线程:写文件开始的位置:"
						+ String.valueOf(startIndex));
				int len = 0;
				byte[] buffer = new byte[2014];
				while ((len = is.read(buffer)) != -1) {
					raf.write(buffer, 0, len);
				}
				is.close();
				raf.close();
				System.out.println("线程" + threadId + "下载完毕");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android平台上实现多线程下载音乐可以通过以下步骤: 1. 首先,在AndroidManifest.xml文件中添加访问网络的权限。 2. 创建一个Service来执行下载任务,这样可以保证在活动销毁或离开前台时下载任务仍然可以继续。 3. 在Service中创建线程池,可以使用Java的Executor框架来实现,例如ThreadPoolExecutor。 4. 在要进行下载的Activity中,通过按钮点击或其他触发方式来启动Service,并传递音乐下载链接等参数。 5. 在Service的onStartCommand方法中,从传递过来的参数中获取音乐下载链接,然后根据需求将链接拆分为多个部分。 6. 使用多线程分别下载这些部分,每个线程可以使用Java的URLConnection或HttpClient等工具类库进行网络请求。 7. 下载完成后,将每个部分的数据合并为完整的音乐文件。 8. 在下载过程中,可以使用BroadcastReceiver来发送下载进度或状态的广播,然后在Activity中注册该广播接收器来更新UI界面。 9. 在下载过程中,可以通过判断当前网络状态来控制下载速度,例如在移动数据网络下可限制下载速度,而在WIFI网络下可充分利用带宽。 10. 需要注意的是,下载过程中要处理异常情况,例如网络中断、服务器异常等,可以使用try-catch块来捕获异常并进行相应的处理。 以上就是Android平台上实现多线程下载音乐的大致步骤,通过合理地利用多线程技术,可以加快下载速度,提升用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值