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();    }}

保存为test.mp3文件


更多相关文章

  1. Android获取经纬度的值并且显示
  2. 我今天的面试题,注册广播有几种方式,这些方式有何优缺点?请谈谈Andr
  3. Android(安卓)仿今日头条频道管理(下)(GridView之间Item的移动和拖
  4. 浅谈Android中的线程的通信及Handle机制
  5. Android学习记录(6)—将java中的多线程下载移植到Android中(即多线
  6. Android(安卓)获取View的位置参数:x,y和相对父容器的偏移量以及中
  7. [置顶] Android学习记录(6)—将java中的多线程下载移植到Android中
  8. Android(安卓)studio 运行即打包keystore之build.gradle设置
  9. android 获取api key

随机推荐

  1. Android(安卓)多点触摸 multi-touch
  2. Android(安卓)Http请求方法汇总
  3. 今天在网上看到了Google的GPhone的消息,学
  4. Android(安卓)SDK升级至revision 12后的
  5. mix
  6. fill_parent和wrap_content 区别和使用效
  7. android数据存储之File
  8. android开关飞行模式的方法
  9. 一个项目搞明白Android(安卓)启动模式和t
  10. android 中apk如何防止反编译?