使用HttpURLConnection(实现单线程多线程下载)
来源:互联网 发布:铁翼雄风 知乎 编辑:程序博客网 时间:2024/06/07 10:56
HttpURLConnection继承URLConnection因此也可向指定网站发送POST,GET请求
单线程下载
class SingleDownloadTask extends AsyncTask<String, Integer, String> { @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); // int count= Integer.parseInt(values[1]*100.0/values[0]); mProgressBar.setProgress((int) (values[0] * 100.0 / values[1])); } @Override protected String doInBackground(String... params) { try { URL url = new URL("http://192.168.0.30:8080/MyWebTest/music/aa.mp3"); URLConnection connection = url.openConnection(); int length = connection.getContentLength(); //publishProgress(length); InputStream is = connection.getInputStream(); File file = new File(Environment.getExternalStorageDirectory(), "aa.mp3"); if (!file.exists()) { file.createNewFile(); } FileOutputStream os = new FileOutputStream(file); byte[] array = new byte[1024]; int sum = 0; int index = is.read(array); while (index != -1) { os.write(array, 0, index); sum += index; publishProgress(sum, length); index = is.read(array); } os.flush(); os.close(); is.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); } }
多线程下载步骤
【1】创建URL对象
【2】获取指定URL对象指向的资源的大小,getContentLength()方法实现;
【3】在本地磁盘创建与资源大小相当的文件
【4】计算每个线程应该下载资源的分配(从那个字节开始,到哪个字节结束)
【5】依次创建启动多个线程下载
private void MultiThreadDownload() { new Thread() { @Override public void run() { String urlPath = "http://192.168.0.30:8080/MyWebTest/music/aa.mp3"; try { URL url = new URL(urlPath); URLConnection connection = url.openConnection(); length = connection.getContentLength(); File file = new File(Environment.getExternalStorageDirectory(), "cc.mp3"); if (!file.exists()) { file.createNewFile(); } MultiThread[] threads = new MultiThread[5]; for (int i = 0; i < 5; i++) { MultiThread thread = null; if (i == 4) { thread = new MultiThread(length / 5 * 4, length, urlPath, file.getAbsolutePath()); } else { thread = new MultiThread(length / 5 * i, length / 5 * (i + 1)-1, urlPath, file.getAbsolutePath()); } thread.start(); threads[i] = thread; } boolean isFinish = true; while (isFinish) { int sum = 0; for (MultiThread thread : threads) { sum += thread.getSum(); } Message msg = handler.obtainMessage(); msg.what = 0x23; msg.arg1 = sum; handler.sendMessage(msg); if (sum + 10 >= length) { isFinish = false; } Thread.sleep(1000); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); }
public class MultiThread extends Thread{ public MultiThread(long start, long end, String url, String filePath) { this.start = start; this.end = end; this.urlPath = url; this.filePath = filePath; } private int sum=0; private long start; private long end; private String urlPath; private String filePath; public int getSum() { return sum; } @Override public void run() { try { URL url = new URL(urlPath); URLConnection connection=url.openConnection(); connection.setAllowUserInteraction(true); connection.setRequestProperty("Range","byte="+start+"-"+end); InputStream is=connection.getInputStream(); byte[] array=new byte[1024]; is.read(array); File file=new File(filePath); RandomAccessFile randomAccessFile=new RandomAccessFile(file,"rw"); randomAccessFile.seek(start); int index=is.read(array); while(index!=-1){ randomAccessFile.write(array,0,index); sum+=index; index=is.read(array); } randomAccessFile.close(); is.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
public class DownloadActivity extends Activity implements View.OnClickListener { private Button mButtonSingle; private Button mButtonMilti; private ProgressBar mProgressBar; private int length; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 0x23: mProgressBar.setProgress(msg.arg1 * 100 / length); break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_download); mButtonSingle = (Button) findViewById(R.id.button_download_single); mButtonMilti = (Button) findViewById(R.id.button_download_milti); mProgressBar = (ProgressBar) findViewById(R.id.progressbar); mButtonMilti.setOnClickListener(this); mButtonSingle.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button_download_single: SingleDownloadTask task = new SingleDownloadTask(); task.execute(); break; case R.id.button_download_milti: MultiThreadDownload(); break; default: break; } } private void MultiThreadDownload() { new Thread() { @Override public void run() { String urlPath = "http://192.168.0.30:8080/MyWebTest/music/aa.mp3"; try { URL url = new URL(urlPath); URLConnection connection = url.openConnection(); length = connection.getContentLength(); File file = new File(Environment.getExternalStorageDirectory(), "cc.mp3"); if (!file.exists()) { file.createNewFile(); } MultiThread[] threads = new MultiThread[5]; for (int i = 0; i < 5; i++) { MultiThread thread = null; if (i == 4) { thread = new MultiThread(length / 5 * 4, length, urlPath, file.getAbsolutePath()); } else { thread = new MultiThread(length / 5 * i, length / 5 * (i + 1)-1, urlPath, file.getAbsolutePath()); } thread.start(); threads[i] = thread; } boolean isFinish = true; while (isFinish) { int sum = 0; for (MultiThread thread : threads) { sum += thread.getSum(); } Message msg = handler.obtainMessage(); msg.what = 0x23; msg.arg1 = sum; handler.sendMessage(msg); if (sum + 10 >= length) { isFinish = false; } Thread.sleep(1000); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); } class SingleDownloadTask extends AsyncTask<String, Integer, String> { @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); // int count= Integer.parseInt(values[1]*100.0/values[0]); mProgressBar.setProgress((int) (values[0] * 100.0 / values[1])); } @Override protected String doInBackground(String... params) { try { URL url = new URL("http://192.168.0.30:8080/MyWebTest/music/aa.mp3"); URLConnection connection = url.openConnection(); int length = connection.getContentLength(); //publishProgress(length); InputStream is = connection.getInputStream(); File file = new File(Environment.getExternalStorageDirectory(), "aa.mp3"); if (!file.exists()) { file.createNewFile(); } FileOutputStream os = new FileOutputStream(file); byte[] array = new byte[1024]; int sum = 0; int index = is.read(array); while (index != -1) { os.write(array, 0, index); sum += index; publishProgress(sum, length); index = is.read(array); } os.flush(); os.close(); is.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); } }}
0 0
- 使用HttpURLConnection(实现单线程多线程下载)
- 使用HttpURLConnection实现多线程下载
- Android 使用HttpURLConnection实现多线程下载 笔记
- android中使用HttpURLConnection实现多线程下载
- Android-使用HttpURLConnection实现多线程下载
- Java使用HttpUrlConnection实现多线程断点下载
- 使用greenDao+HttpurlConnection实现多线程断点下载
- HttpURLConnection实现多线程下载
- android HttpURLConnection实现多线程下载
- HttpURLConnection实现多线程网络下载
- HttpUrlConnection实现多线程下载网络资源
- 使用HttpUrlConnection多线程下载文件
- Android开发_使用HttpURLConnection实现多线程下载
- Android移动开发-使用HttpURLConnection实现多线程的下载
- Android HttpURLConnection断点下载(单线程)
- HttpURLConnection(四)-多线程下载
- 使用HttpURLConnection实现文件下载
- HttpURLConnection实现多线程下载资源contentLength()
- hdoj1044,Collect More Jewels
- 第二章 数据库的操作
- 索引器(封装一个数组类)改params关键字
- Leetcode Maximum Product Subarray
- 《剑指offer》整数中1出现的次数(从1到n整数中1出现的次数)
- 使用HttpURLConnection(实现单线程多线程下载)
- UVa 11214:Guarding the Chessboard(DFS)
- java多态初步
- matlab中linspace函数
- 飘雪作业——index.html
- ListView 分页效果
- 0基础自学《第一行代码》
- 动态决定嵌套循环层数的方法
- 零基础学python-16.1 作用域快速入门