zoukankan      html  css  js  c++  java
  • Android多线程下载

    所用知识点:

    1、设置http协议字段Range “bytes=“start+”-”+end

    conn.addRequestProperty("Range", "bytes=" + start + "-" + end);

    2、RandomAccessFile设置写入的位置

    // 指定文件方式为可读写可操作
    RandomAccessFile accessFile = new RandomAccessFile(new File(fileName),"rwd");
    accessFile.seek(start);

    3、开启多线程发送网络请求

      // 启动下载

    DownloadRunnable runnable = new DownloadRunnable(url,downLoadFile.getAbsolutePath(),start,end);
    threadPool.execute(runnable);

    DownLoad.java

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

    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;

    /**
     *
     */
    public class DownLoad {

        // 创建线程池
        private Executor threadPool=  Executors.newFixedThreadPool(3);

       private Handler handler;

        public DownLoad(Handler handler)
        {
            this.handler = handler;
        }

        private class DownloadRunnable implements Runnable
        {
            private String url;

            private String fileName;

            private int start;

            private  int end;

            public DownloadRunnable(String url,String fileName,int start,int end)
            {
                this.url = url;
                this.fileName = fileName;
                this.start = start;
                this.end = end;
            }

            @Override
            public void run() {
                    try {
                        URL httpUrl = new URL(url);
                        HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
                        conn.setRequestMethod("GET");
                        conn.setReadTimeout(5000);
                        conn.addRequestProperty("Range", "bytes=" + start + "-" + end);
                        // 指定文件方式为可读写可操作
                        RandomAccessFile accessFile = new RandomAccessFile(new File(fileName),"rwd");
                        accessFile.seek(start);

                        InputStream in = conn.getInputStream();
                        // 设置缓冲区
                        byte b[] = new byte[4 + 1024];
                        int len =0;
                        while ((len = in.read(b))!=-1)
                        {
                            accessFile.write(b,0,len);
                        }

                        if (accessFile!=null)
                        {
                            accessFile.close();
                        }
                        if (in!=null)
                        {
                            in.close();
                        }
                        Message message = Message.obtain();
                        message.what = 1;
                        handler.sendMessage(message);

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
            }
        }

        public void downLoadFile(String url)
        {
            try {
                URL httpUrl = new URL(url);
                try {
                    HttpURLConnection conn =  (HttpURLConnection)httpUrl.openConnection();
                    conn.setRequestMethod("GET");
                    conn.setReadTimeout(5000);
                    int length = conn.getContentLength();
                    int block =  length/3;
                    int start;
                    int end;
                    String fileName = getFileName(url);
                    File parent = Environment.getExternalStorageDirectory();
                    File downLoadFile = new File(parent,fileName);
                    /**
                     * 假如总长度为11
                     * block = 11/3=3
                     * 第一个线程下载0-block=0-2
                     * 第二个线程下载3-2*block-1= 3-5
                     * 第三个线程下载6-length=6-11
                     * */
                    for (int i=0;i<3;i++)
                    {
                        start = i*block;
                        end = (i+1)*block -1;
                        if (i == 2)
                        {
                            end = length;
                        }
                        // 启动下载
                        DownloadRunnable runnable = new DownloadRunnable(url,downLoadFile.getAbsolutePath(),start,end);
                        threadPool.execute(runnable);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }

        private String getFileName(String url)
        {
            return url.substring(url.lastIndexOf("/"));
        }
    }

    MainActiviy.java 关键代码

    private int count=0;
    handler = new android.os.Handler()
    {
    @Override
    public void handleMessage(Message msg) {
    super.handleMessage(msg);
    count +=msg.what;
    // 说明三个线程都下载完成
    if (count == 3)
    {
    textView.setText("Download Succ");
    }
    }
    };


    textView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    new Thread(new Runnable() {
    @Override
    public void run() {
    new DownLoad(handler).downLoadFile("http://192.168.0.103:8080/Pro_Test/aa.jpg");
    }
    }).start();
    }
    });
     


  • 相关阅读:
    第一章:Android系统的编译和移植实例读书笔记
    第二章:Android系统与嵌入式开发读书笔记
    第三章:Android移植平台工具介绍读书笔记
    第十章 嵌入式Linux的调试技术
    第九章 硬件抽象层:HAL
    第八章 让开发板发出声音:蜂鸣器驱动
    第七章 LED将为我闪烁:控制发光二极管
    第六章 第一个Linux驱动程序:统计单词个数
    第五章 搭建S3C6410开发板的测试环境
    第四章 源代码的下载和编译
  • 原文地址:https://www.cnblogs.com/baiyi168/p/5365896.html
Copyright © 2011-2022 走看看