package my.Thread;import java.io.BufferedInputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLConnection;import java.util.concurrent.CountDownLatch;import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class ManyThreadActivity extends Activity {    /** Called when the activity is first created. */ private Button button; private TextView textView; private static final int THREAD_COUNT = 4; private CountDownLatch latch = new CountDownLatch(THREAD_COUNT); private long completeLength = 0; private long fileLength;  public static String SaveFile=Environment.getExternalStorageDirectory()+"/DownFile/"+"test.Mp3";    public static final String url="http://210.30.12.33:8080/mp3/Beyond.mp3";    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        button=(Button)findViewById(R.id.button1);        textView=(TextView) findViewById(R.id.editText1);        textView.setText(url);        button.setOnClickListener(new MyListener());    }    class MyListener implements OnClickListener{@Overridepublic void onClick(View v) {// TODO Auto-generated method stubtry {download(url);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}        }    //进行下载的线程    class DownloadThread extends Thread {        private URL url;        private RandomAccessFile file;        private long from;        private long end;        /**         * @param url 下载的URL         * @param file 下载完成之后存储的文件         * @param from 当前线程对应文件的起始位置         * @param end 当前线程对应文件的结束位置         */        DownloadThread(URL url, RandomAccessFile file, long from, long end) {            this.url = url;            this.file = file;            this.from = from;            this.end = end;        }        public void run() {            try {                long pos = from;                byte[] buf = new byte[1024*8];                HttpURLConnection cn = (HttpURLConnection) url.openConnection();                               //设置请求的起始和结束位置。                cn.setRequestProperty("Range", "bytes=" + from + "-" + end);                BufferedInputStream bis = new BufferedInputStream(cn.getInputStream());                int len;                while ((len = bis.read(buf)) > 0) {                    synchronized (file) {                        file.seek(pos);                        file.write(buf, 0, len);                    }                    pos += len;                    completeLength += len;                    System.out.println(completeLength * 100 / fileLength + "%");                }                cn.disconnect();            } catch (Exception e) {                e.printStackTrace();            }            latch.countDown();        }    }    public void download(String address) throws Exception {        URL url = new URL(address);        URLConnection cn = url.openConnection();        fileLength = cn.getContentLength();        long packageLength = fileLength / THREAD_COUNT;//每个线程要下载的字节数        long leftLength = fileLength % THREAD_COUNT;//剩下的字节数               RandomAccessFile file = new RandomAccessFile(SaveFile, "rw");               System.out.println(fileLength);        //计算每个线程请求的起始位置和结束位置。        /*         * 第一个线程的起始位置是0~0+packageLength(每个线程要下载的字节数)         * 第二个线程的起始位置是endPos+1(第一个线程的packageLength+1)~endPos+1+packageLength         * 第二个线程的起始位置是.........         */        long pos = 0;        for (int i = 0; i < THREAD_COUNT; i++) {            long endPos = pos + packageLength;            new DownloadThread(url, file, pos, endPos).start();            if(leftLength > 0) {                endPos++;                leftLength--;            }            pos = endPos;        }        latch.await();    }}

Android 多线程下载_第1张图片

保存为test.mp3文件

Android 多线程下载_第2张图片

更多相关文章

  1. Android 通过HTTP POST 上传图片文件
  2. Android studio 3.0和unity交互 Manifest文件修改后正确的内容
  3. 关于Android WebView上传文件的解决方案
  4. android httpclient 上传文件
  5. 从J2EE转向Android的第六天-----文件管理
  6. Android Studio Gradle多渠道打包(动态设定App名称,应用图标,背景

随机推荐

  1. Python 用hashlib求中文字符串的MD5值
  2. 长安铃木经销商爬取(解析xml、post提交、p
  3. Python基础(4) - 变量
  4. 关于Python的super用法研究
  5. 以DAG方式调度作业
  6. Python阻止复制对象作为参考
  7. Python下numpy不成功的解决办法(wheel方法
  8. python应用之socket编程
  9. [Python]—Linux Server 系统监控程序
  10. 对照java和spring理解python中单例模式的