Http通信模仿迅雷多线程下载

原创 2016年06月01日 14:05:37

转载请注明出处:http://blog.csdn.net/wei_chong_chong/article/details/51555388

用到的知识点:

1.Http 协议字段"Range", "bytes="+start+"-"+end

2.RandomAccessFile设置写入的位置

3.开启线程发送网络请求以及线程池操作


首先,在服务器端放一张图片,如下在WebRoot下放置了一张lufei.jpg图片


跟访问网页一样通过url直接访问:http://pc-20141102midc:8080/DownLoadFile/lufei.jpg

然后在Android端写多线程下载的代码:

为了防止遗忘现在配置文件中声明权限:

  <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.download_file.MainActivity" >

    <Button
        android:id="@+id/start_download_bt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="下载"
        android:textColor="@android:color/background_dark" />

    <TextView
        android:id="@+id/my_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</LinearLayout>

下载类:

DownLoad.java

package com.example.download_file;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

import android.os.Environment;
import android.os.Handler;
import android.os.Message;

/**
 * 多线程下载例子
 * @author weichongchong
 *
 */
public class DownLoad {
	private Handler mHandler;
	public DownLoad(Handler handle){
		this.mHandler= handle;
	}

	//通过线程池下载,创建线程池对象
	private Executor threadPool = Executors.newFixedThreadPool(3);//创建三个线程池

	static class DownLoadRunnable implements Runnable{
		private String url;
		private String fileName;
		private long start;
		private long end;
		private Handler handler;
		public DownLoadRunnable(String url ,String fileName,long start,long end,Handler handler ){
			this.url=url;
			this.fileName = fileName;
			this.start = start;
			this.end = end;
			this.handler= handler;
		}
		@Override
		public void run() {
			// TODO Auto-generated method stub

			try {
				URL httpUrl = new URL(url);
				HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
				conn.setReadTimeout(5000);
				conn.setRequestProperty("Range", "bytes="+start+"-"+end);//指定长度

				conn.setRequestMethod("GET");
				//创建随机读取流进行读取
				RandomAccessFile access = new RandomAccessFile(new File(fileName), "rwd");//第二个参数代表可读,可写,可执行
				access.seek(start);
				InputStream in = conn.getInputStream();
				byte[] b = new byte[1024*4];
				int len=0;
				while((len = in.read())!=-1){
					access.write(b,0,len);
				}
				if(access!=null){
					access.close();
				}
				if(in!=null){
					in.close();
				}
				//下载完成通知更新UI
				Message message = new  Message();
				message.what=1;
				handler.sendMessage(message);
				//				int count = conn.getContentLength();//拿到下载对象的长度
				//				int block = count/3;//平均到每个线程池
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}


		}
	}
	public void downLoadFile(String url){


		try {
			URL httpUrl = new URL(url);
			HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
			conn.setReadTimeout(5000);
			conn.setRequestMethod("GET");
			int count = conn.getContentLength();//拿到下载对象的长度
			int block = count/3;//平均到每个线程池
			String fileName = getFileName(url);
//			File parent = Environment.getExternalStorageDirectory();
//			File fileDownLoad = new File(parent,fileName);
			File fileDownLoad  = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),fileName);
			/**
			 * 11/3  3
			 * 第一个线程0-2
			 * 第二个3-5
			 * 第三个6-10
			 */

			for(int i=0;i<3;i++){
				long start = i*block;
				long end = (i+1)*block-1;
				if(i==2){
					end=count;
				}
				DownLoadRunnable runnable = new DownLoadRunnable(url,fileDownLoad.getAbsolutePath(),start,end,mHandler);
				threadPool.execute(runnable);//通过线程池提交任务
			}
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}


	}
	/**
	 * 
	 * @return
	 * 得到url后缀名,即文件名
	 */
	public String getFileName(String url){
		return url.substring(url.lastIndexOf("/")+1);
	}
}

MainActivity中代码使用下载类进行下载

package com.example.download_file;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {

	private Button start_download_bt;
	private TextView mytv;
	private int count = 0;

	private Handler mHandler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			int result = msg.what;
			count+=result;//如果三个线程都下载完成,都返回一个1,相加为3
			if(count==3){
				mytv.setText("下载完成");
				start_download_bt.setText("下载完成");
			}
		};
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		start_download_bt = (Button) findViewById(R.id.start_download_bt);
		mytv = (TextView) findViewById(R.id.my_tv);

		start_download_bt.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub

				start_download_bt.setText("正在下载");
				Toast.makeText(MainActivity.this, "正在下载", 0).show();
				
				
				new Thread(){
					@Override
					public void run() {
						// TODO Auto-generated method stub

						DownLoad mDownLoad  = new DownLoad(mHandler);
						mDownLoad.downLoadFile("http://192.168.1.105:8080/DownLoadFile/lufei.jpg");
					}
				}.start();

			}
		});
	}
}



版权声明:本文为博主原创文章,转载请注明出处。

相关文章推荐

Android 雷达扫描动画效果实现

在新浪微博上有一个雷达功能,感觉类似于微信附近的人。只是多了一个类似于雷达扫描效果的动画,某些知名安全软件也有这样的雷达效果,因此在这里学习一下。...

转:用迅雷下载Android SDK全系列

今天把SDK更新到了2.3版,更新的过程中遇到了一些问题,比如无法使用ADT v0.99来更新,只能升级ADT才能看到可用的更新包,另外使用自带的SDK Manager更新时速度实在太慢了,平时用惯了...

<MFC多线程> 一道迅雷多线程编程题

题目要求: 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推 分析: 本...

Android中的Http通信(四)之多线程下载数据

如果你还想了解Http的基础知识、通过url获取网络数据以及GET、POST方式上传数据到服务器,请查看我前面几篇博文。Android中的Http通信(一)之Http协议基本知识、Android中的H...

HTTP多线程下载

  • 2017年11月13日 09:29
  • 36.79MB
  • 下载

winlnet多线程http下载三

  • 2017年07月14日 18:14
  • 40.35MB
  • 下载

[原]unity3d之http多线程异步资源下载

本文诞生于乐元素面试过程,被面试官问到AssetBundle多线程异步下载时,愣了半天,同样也被深深的鄙视一回(做了3年多u3d 这个都没用过),所以发誓要实现出来填补一下自己的空白,同时分享给大家。...

winlnet多线程http下载四

  • 2017年07月14日 18:15
  • 67.16MB
  • 下载

HTTP多线程下载

  • 2014年06月24日 13:29
  • 54KB
  • 下载

Http多线程下载文件的处理机制

导读: 1.http关于下载的相关字段. 2.Android多线程下载的原理. 3.Android上面进行Http请求下载的需要解决的一些问题.1.http关于下载方面的一些字段(1)Transfer...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Http通信模仿迅雷多线程下载
举报原因:
原因补充:

(最多只允许输入30个字)